查看: 457|回复: 6|关注: 1

[技术文章] solve求解方程的若干常见问题

[复制链接]

论坛优秀回答者

7

主题

1508

帖子

321

最佳答案
  • 关注者: 77
发表于 2020-6-3 15:19:00 | 显示全部楼层 |阅读模式
solve函数是解方程经常使用的函数,有很多坛友在使用该函数时经常遇到问题,现简单汇总如下
一、使用用法老旧

  1. syms x
  2. a=1;
  3. equ='x^2==a';
  4. xs=solve(equ,x)
复制代码

会报错
Error using solve>getEqns (line 418)
List of equations must not be empty.

错误在于使用用法过于陈旧,现使用的MATLAB多为高版本
解决办法
使用用法改变,具体参见solve帮助文档

  1. syms x
  2. a=1;
  3. equ=x^2==a;
  4. xs=solve(equ,x)
复制代码

xs =

-1
  1
二、循环求解
解方程经常遇到方程的一个或多个参数是变化的
例如例子的变量a分别等于1、4、9、16
经常会出现以下代码
  1. syms x
  2. a=[1,4,9,16];
  3. equ=x^2==a;
  4. xs=solve(equ,x)
复制代码

MATLAB运算无解
xs =

Empty sym: 0-by-1

这种情况应使用循环求解
但有时会遇到以下情况
  1. syms x
  2. a=[1,4,9,16];
  3. for i=1:length(a)
  4. equ=x.^2==a(i);
  5. x=solve(equ,x)
  6. end
复制代码

报错如下
x =

-1
  1

Error using sym.getEqnsVars>checkVariables (line 92)
Second argument must be a vector of symbolic variables.

原因在于经过第一次循环后,变量x以转变为具体数值(-1,1),即导致在第二次循环中方程里无未知量
解决办法保存解得变量名改变
循环求解方程并保存变量的代码如下
  1. syms x
  2. a=[1,4,9,16];
  3. for i=1:length(a)
  4. equ=x.^2==a(i);
  5. xs(i,:)=solve(equ,x);
  6. end
复制代码

运行后在命令窗口输入xs即可看到全部解如下
>> xs

xs =

[ -1, 1]
[ -2, 2]
[ -3, 3]
[ -4, 4]
希望对需要的坛友有所帮助,也希望大家多提宝贵意见,共同进步
回复主题 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
发表于 2020-6-16 18:30:13 | 显示全部楼层
您好,想问一下如果有两个变量需要代入呢,例如a和b。需要写两个for循环么?对于结果xs( )表示啊?
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

7

主题

1508

帖子

321

最佳答案
  • 关注者: 77
 楼主| 发表于 2020-6-18 21:13:04 | 显示全部楼层
ChanceLeo 发表于 2020-6-16 18:30
您好,想问一下如果有两个变量需要代入呢,例如a和b。需要写两个for循环么?对于结果xs( )表示啊?
...

请具体描述下你的问题,可能需要两个for循环,可能一个即可,最好有代码
回复此楼 已获打赏: 0 积分

举报

禁止访问

5 麦片

财富积分



0

主题

5

帖子

0

最佳答案
发表于 2020-6-19 14:02:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

7

帖子

0

最佳答案
  • 关注者: 1
发表于 2020-6-21 18:59:27 | 显示全部楼层
本帖最后由 LLtat 于 2020-6-21 19:02 编辑

clear
syms x
a=100;b=99;c=100;d=91;
y=[100,99];
for i=1:length(y)
eq1=(a-y(i))./(y(i)-b)==(c-x)./(x-d);
xs(i,:)=solve(eq1,x);
end
您好,这是我类比着你的帖子写出来的代码,一直有错误,
赋值具有的非单一 rhs 维度多于非单一下标数
我找不到错误在哪里,求大佬赐教!
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

7

主题

1508

帖子

321

最佳答案
  • 关注者: 77
 楼主| 发表于 2020-6-21 19:27:41 | 显示全部楼层
LLtat 发表于 2020-6-21 18:59
clear
syms x
a=100;b=99;c=100;d=91;

原因在于当y=99时,方程左侧分母为零,修改如下,仅供参考
  1. clear
  2. syms x
  3. a=100;b=99;c=100;d=91;
  4. y=[100,99];
  5. for i=1:length(y)
  6. eq1=(a-y(i))./(y(i)-b+eps)==(c-x)./(x-d);
  7. xs(i,:)=vpasolve(eq1,x);
  8. end
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

7

帖子

0

最佳答案
  • 关注者: 1
发表于 2020-6-21 19:42:34 | 显示全部楼层
20141303 发表于 2020-6-21 19:27
原因在于当y=99时,方程左侧分母为零,修改如下,仅供参考

晓得了,真是太感谢了!万分感谢!
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表