声明:本文章中数据来自清风老师数学建模课程
%% 例题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为整数
%% 例题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
%% 例题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])
如在对方程进行以下求解时,MATLAB会给出警告。
%% solve 可能会警告
syms x
eqn = (sin(x) == x^2 - 1);
solve(eqn, x)
这是因为所求的方程超出了solve函数求解的能力了,在这种情况下继续使用solve函数求解可能其算法求的值与我们的要求的结果相差甚远。并且MATLAB建议使用vpasolve进行求解。
绘图:
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) % 给定搜索的起始点
%% 来看一个更复杂的例子
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是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)