声明:本文章中数据来自清风老师数学建模课程
文章目录
MATLAB求解方程和方程组
- 不同MATLAB版本间语法存在不兼容的情况,关于这个问题其实我们只需要查看所使用版本的MATLAB帮助文档即可,具体的可以参考知乎中https://www.zhihu.com/question/360875116/answer/937256480这里的一个评论。
- MATLAB中有关方程和方程组的求解有比较多的命令,这里我们仅介绍其中的3个命令,分别为:solve函数、vpasolve函数、fsolve函数。其他有关方法可以在使用到时查看帮助文档。这里也有一篇有关MATLAB求解方程和方程组的博文供参考学习:https://www.cnblogs.com/gentle-min-601/p/9672221.html
1、solve函数
1.1 求解单变量方程
%% 例题1: 求解单变量方程
clear;clc
syms x
answ = solve(sin(x) == 1, x) % 注意:这里的等号一定要有两个,一个等号表示赋值,两个等号才表示左右两边相等
answ = solve(sin(x) == 1) % 只有一个符号变量x,所以可以不指定未知数
% 也可以这样写
clear;clc
syms x
eqn = (sin(x) == 1); % eqn = sin(x) == 1; % 这里因为优先级的关系可以将括号省去
answ = solve(eqn, x) % 当所求的方程过长时,这样先将方程赋值给eqn,然后将eqn带到solve中,更加美观
% 因为三角函数是周期函数,如果要得到所有的解,则需要加上条件
[answ, params, condions] = solve(eqn, x, 'ReturnConditions', true)
需要注意的是这里,当求解的是周期函数时,若想将返回的解为周期值,需要带上ReturnConditions参数并设为true
如下:其中in(k,‘integer’)表示k为整数
1.2 多变量方程求解
%% 例题2: 多变量方程求解
clear;clc
syms a b c x
eqn = (a*x^2 + b*x + c == 0);
answ1 = solve(eqn, x) % 将x视为未知数求解
% -(b + (b^2 - 4*a*c)^(1/2))/(2*a)
% -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
answ2 = solve(eqn, a) % 将a视为未知数求解
% -(c + b*x)/x^2
1.3 方程组的求解
%% 例题3:方程组求解
clear;clc
syms u v a
eqn = [2*u + v == a, u - v == 1];
answ = solve(eqn, [u, v])
answ.u
answ.v
[answ_u, answ_v] = solve(eqn, [u, v])
1.4 solve求解时可能出现的问题
如在对方程进行以下求解时,MATLAB会给出警告。
%% solve 可能会警告
syms x
eqn = (sin(x) == x^2 - 1);
solve(eqn, x)
这是因为所求的方程超出了solve函数求解的能力了,在这种情况下继续使用solve函数求解可能其算法求的值与我们的要求的结果相差甚远。并且MATLAB建议使用vpasolve进行求解。
2、vpasolve函数
- vpasolve默认情况下只返回一个我们指定区间内的解,若想返回多个结果需要我们指定’random’为true,多次求解来获得不同的解
- 通常情况下,当所求方程不是很复杂时可以画出方程对应函数的图像,确定方程根的大致范围,再结合vpasolve进行求解
2.1 vapsolve的使用
绘图:
syms x
fplot(sin(x), [-2 2]) % fplot函数可绘制表达式的图形
hold on
fplot(x^2 - 1, [-2 2])
%% vpasolve函数求解
% 用vpasolve函数指定求[0 2]上的解
syms x
eqn = sin(x) == x^2 - 1;
vpasolve(eqn, x, [0 2])
vpasolve(eqn, x, [-1 0])
vpasolve(eqn, x, [-10 10])
% vpasolve returns all solutions only for polynomial equations.
% For nonpolynomial equations, there is no general method of finding all solutions.
% When you look for numerical solutions of a nonpolynomial equation or system that has several solutions,
% then, by default, vpasolve returns only one solution, if any.
% To find more than just one solution, set random to true.
% Now, calling vpasolve repeatedly might return several different solutions.
vpasolve(eqn, x, 'random', true)
vpasolve(eqn, x, -5) % 给定搜索的起始点
2.2 vpasolve解决一个更复杂的例子
%% 来看一个更复杂的例子
syms x y
eqn = [x^2 - 2*x - 3*x*y == 10, y^4 == exp(-2*x/3)]
[answ_x, answ_y] = vpasolve(eqn, [x, y], 'random', true)
% 画图看看
ezplot(x^2 - 2*x - 3*x*y == 10, [-10 10])
hold on
ezplot(y^4 == exp(-2*x/3*y), [-10 10])
close % 关闭图形
% ezplot函数比较鸡肋,下面这个函数比较厉害哦
fimplicit(x^2 - 2*x - 3*x*y == 10, [-10 10],'r') % R2016b版本之后才有
hold on
fimplicit(y^4 == exp(-2*x/3*y), [-10 10],'b') % R2016b版本之后才有
[answ_x, answ_y] = vpasolve(eqn, [x, y],[-4 -1;1 5]) % 指定搜索的范围:x位于[-4 -1], y位于[1 5]
hold on
plot(answ_x, answ_y,'ko', 'MarkerSize',10)
% plot(double(answ_x), double(answ_y),'ko', 'MarkerSize',10) % double可以将我们的符号变量转换为数值变量
三、fsolve函数
fsolve是Matlab优化工具箱中的一个函数,可专门用来求解特别复杂的方程和方程组
在使用fsolve函数进行求解时需要将我们要求解的方程或者方程组写入函数中,然后将函数句柄带入fsolve中。
%% 待求解方程组
function F = my_fun(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end
%% 求解
x0 = [0,0]; % 初始值
result_x = fsolve(@my_fun,x0)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/39313.html