-
定解方程组
计算过程:
注意:
矩阵系数中,逗号和分号的使用
矩阵除法用反斜杠\
矩阵中的值提取用小括号,行列数从1开始算
-
不定方程组
未知数大于方程数,其解有无数个,matlab可以求出其中一个特定解
计算过程
计算过程:
注意:
矩阵系数中,逗号和分号的使用
矩阵除法用反斜杠\
矩阵中的值提取用小括号,行列数从1开始算
未知数大于方程数,其解有无数个,matlab可以求出其中一个特定解
计算过程
转载于:https://www.cnblogs.com/derek32/p/4042829.html
如何利用matlab求解方程
1. 前言
作为三大数学软件之一,matlab在数值计算方法的能力首屈一指。求解方程是工科学习和工程计算中最基础、最常见的问题。掌握利用现代化工具求解方程的方法对于提升我们的工科素养至关重要。为此,本篇将对matlab中求解方程的方法进行介绍。
2. 用法
求解过程
2.1 指明变量
告诉电脑方程中所含有的变量,包括参数和未知变量。比如:所求解的方程为:,很显然该方程中有a,b,c,x符号变量,因此该步骤的写法为:
syms a b c x |
2.2 指明方程,未知数和限制条件(非必需)
eqns | 方程,如果超过一个,则放在[ ]中,并用逗号隔开。如: |
Vars | 待求的未知数 |
Names-value(非必需) | Names:‘returnConditions’ 是否返回出含有参数的通解。’true‘为返回,’false‘为否,即给出一个特解; |
Name: 'IgnoreAnalyticConstraints' 是否给出解的最简形式。 ‘true‘为是,‘false’为否 | |
Name:'PrincipalValue' 是否仅给出一个解。False为返回所有的解,true为仅返回一个解; | |
Name:’Real’ 是否仅返回实数解 |
2.3 获得所求方程的解
如果为多个函数,该解存储形式为结构体。
3. 具体实例
3.1 求解sin(x)=1的通解
具体代码:
syms x [x,params,conds]=solve(sin(x)==1,'ReturnConditions', true) |
结果
solx =pi/2+2*pi*k params =k conds =in(k,'integer') |
可以看出,该方程的通解为:
3.2 求解以下方程:
代码:
syms a b c y x [x,y]=solve([a*x^2+b*y+c==0,a*x+2*y==4],[x,y]) |
结果:
x = ((a*b)/4-(-(a*(- a*b^2+32*b +16*c))/16)^(1/2))/a ((a*b)/4+(-(a*(- a*b^2+32*b +16*c))/16)^(1/2))/a
y = (-(a*(- a*b^2+32*b +16*c))/16)^(1/2)/2-(a*b)/8+2 2-(-(a*(- a*b^2+32*b +16*c))/16)^(1/2)/2-(a*b)/8 |
即:
声明:本文章中数据来自清风老师数学建模课程
%% 例题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)