MATLAB求解方程和方程组

声明:本文章中数据来自清风老师数学建模课程

文章目录

  • MATLAB求解方程和方程组
    • 1、solve函数
      • 1.1 求解单变量方程
      • 1.2 多变量方程求解
      • 1.3 方程组的求解
      • 1.4 solve求解时可能出现的问题
    • 2、vpasolve函数
      • 2.1 vapsolve的使用
      • 2.2 vpasolve解决一个更复杂的例子
    • 三、fsolve函数

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为整数
MATLAB求解方程和方程组_第1张图片

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)

MATLAB求解方程和方程组_第2张图片
这是因为所求的方程超出了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]) 

MATLAB求解方程和方程组_第3张图片

%% 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解决一个更复杂的例子

MATLAB求解方程和方程组_第4张图片

%% 来看一个更复杂的例子
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)

你可能感兴趣的:(MATLAB)