MATLAB的solve函数求非线性解方程或方程组

solve函数可用来求解代数方程(组)与非线性方程(组),具体使用格式如下:

solve('F','var'):用于求解单个方程情形,F表示求解方程,var表示求解变量。当求解变量省略时,
表示对默认变量求解。若方程为符号方程,求解变量为符号变量时,上述格式中的单引号省略;
[x1,x2,…,xn]=solve('F1','F2',…,'Fn','var1','var2',…,'varn'):用于求解n个方程组成的方程组问题,
F1, F2, …, Fn表示各个方程,var1, var2, …, varn表示各个求解变量,[x1,x2,…,xn]表示求解结果。
S = solve(eqn,var)
S = solve(eqn,var,Name,Value)
Y = solve(eqns,vars)
Y = solve(eqns,vars,Name,Value)
[y1,...,yN] = solve(eqns,vars)
[y1,...,yN] = solve(eqns,vars,Name,Value)
[y1,...,yN,parameters,conditions]=solve(eqns,vars,'ReturnConditions',true)

实例求解

1.求解单变量方程

程序

clc;
clear all;
close all;
syms x
eqn = sin(x) == 1;
solx = solve(eqn,x)

运行结果

 
solx =
 
pi/2

程序


clc;
clear all;
close all;
syms x  %是必要的,这将会把x设为符号变量
eq=x^2+2*x+1;%eq也会变为一个符号变量用于储存方程
s=solve(eq,x)  %方程的结果由solve函数返回,存储在s里。注意(eq,x)中x是说明eq这个方程中x为变量
%如果返回empty,则表明解不存在。如果返回empty+warning,则解可能存在,但是solve找不到

运行结果

 
s =
 
 -1
 -1

2.对方程组的求解

程序


clc;
clear all;
close all;
syms x y
eq1 = x + 2*y-8;
eq2 = 3*x+5*y-4;
s1 = solve(eq1,eq2,x,y)
s1.x
s1.y
[s11,s111] = solve(eq1,eq2,x,y)

运行结果


s1 = 

  包含以下字段的 struct:

    x: [1×1 sym]
    y: [1×1 sym]

 
ans =
 
-32
 
 
ans =
 
20
 
 
s11 =
 
-32
 
 
s111 =
 
20
 
>> 

3.返回数值解

程序


%解析解(analytical solution):用严格的公式表示的解。
%数值解(numerical solution):无法用严格的公式表示,是采用某种计算方法(有限元、逼近、插值)得到的。
%symbolic solver无法找到精确的用符号表示的解,因此在调用numeric solver之前会事先声明(warning)。因为等式不是多项式,所以想要找到全部可能的解需要很长时间。
%numeric solver不会尽力去找等式的全部numeric solution,它仅仅返回它找到的第一个解。
clc,clear
syms x
solve(sin(x)==x^2-1,x)
%验证上面的等式确实有一个正值解:画出等式的左右两部分的曲线
ezplot(sin(x),-2,2)
hold on
ezplot(x^2-1,-2,2)
hold off
%也可以直接用函数vpasolve求出数值解(需要定义(寻找)解的范围)
vpasolve(sin(x)==x^2-1,x,[0 2 ])

运行结果

ans =
 
-0.63673265080528201088799090383828
 
 
ans =
 
1.4096240040025962492355939705895


4.求解不等式

程序


clc,clear
syms x y
S=solve(x^2+y^2+x*y<1,x>0,y>0 , [x,y], 'ReturnConditions',true);
solx=S.x
soly=S.y
params=S.parameters
conditions=S.conditions
%利用subs和isAlways检验u=7/2和v=1/2是否满足约束条件
isAlways(subs(S.conditions,S.parameters,[7/2,1/2]))
%isAlways返回loogical 1(true)表示这些值满足约束条件。将这两个参数的值带入(函数subs)S.x和S.y中,找到一个x和y的解
solx=subs(S.x,S.parameters,[7/2,1/2])
soly=subs(S.y,S.parameters,[7/2,1/2])
%用函数vpa得到解的数值形式
vpa(solx)
vpa(soly)

运行结果

 solx =
(- 3*v^2 + u)^(1/2)/2 - v/2
soly =
v

params =
[ u, v]
conditions =
4*v^2 < u & u < 4 & 0 < v
ans =
  logical

   1
 
solx =
 
11^(1/2)/4 - 1/4

soly =
 
1/2
 
ans =
 
0.57915619758884996227873318416767
 
 
ans =
 
0.5
 
>> 

5.返回实数解

程序

clc,clear
syms x
solve(x^5==3125,x)
%如果仅仅需要一个实数解,那么就把选项Real设置成true
solve(x^5==3125,x,'Real',true)

运行结果

 
ans =
 
                                                          5
 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
   (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
   (5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
   (5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
 
 
ans =
 
5
 
>> 

6.符号解求解多变量方程

程序


%为了避免求解方程时对符号参数产生混乱,需要指明一个等式中需要求解的变量。
%如果不指明的话,solve函数就会通过symvar选择一个变量(认为该变量是要求解的变量)
clc,clear
syms a b c x
sola=solve(a*x^2+b*x+c==0,a) %待求解的变量是a
sol=solve(a*x^2+b*x+c==0) %待求解的变量是x

运行结果

 
sola =
 
-(c + b*x)/x^2
 
 
sol =
 
 -(b + (b^2 - 4*a*c)^(1/2))/(2*a)
 -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
 

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙

举报
评论 0