matlab是美国m瞢铍库祢athworks公司出的商业数学软件,用于算法开发、数据可视化、数据分析以赂徭沼颞及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
但由于其功能的强大,对于初学者显得有些困难,下面,为广大初学者介绍下matlab如何求解方程。
matlab方程求解有两种方法,符号求解和数值求解。
1.solve
通常在不确定方程是否有符号解的时候,推荐先使用solve进行尝试,因为solve相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,
solve还能够自动调用数值计算系统给出一个数值解。solve的调用形式:
S=solve(eqn1,eqn2,...,eqnM,var1,var2,...,varN)
[S1,�,SN]=solve(eqn1,eqn2,...,eqnM,var1,var2,...,varN)
eq为符号表达式,var为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则matlab自动按默认变量进行求解,默认变量可以由symvar(eq)确定。
例:求解方程组:x^2+x*y+y=3,x^2-4*x+3=0
matlab代码:
symsxy%声明符号变量
eq1=x^2+x*y+y-3
eq2=x^2-4*x+3
[Sx,Sy]=solve(eq1,eq2,x,y)
2.fzero
然而在很多情况下solve并不能求得方程的解析解,这时就可以采用数值法求解。
数值求解法包括fzero和fsolve,其区别在于fzero只适用求解一元函数零点,而fsolve适用于求解多元函数零点(包括一元函数)。
当求解一元函数零点时,推荐优先使用fzero,原因是fzero求解一元方程往往更容易,因为它不仅支持提供初值的搜索,还支持在一个区间上进行搜索。
fzero的常用形式:
x=fzero(fun,x0)
[x,fval]=fzero(fun,x0)
其中fun为函数句柄,x0为搜索初值,fval为求解误差。
以一元方程sin(x)+cos(x)^2=0为例:
y=@(x)sin(x)+cos(x).^2%这里采用匿名函数,也可以使用函数文件形式
[x,fval]=fzero(y,1)%1为搜索初值
如果方程有多个零点时,fzero只能根据你提供的初值求得最靠近初值的一个零点,如果希望求得多个零点的话,那么只能够通过改变初值来得到不同的零点。
对于零点的选取,目前来说没有什么比较好的办法,只能够通过分析方程的性质,或者通过作图的方法去寻找一个比较靠近零点的初值。另外,fzero能够提供区间搜索,注意区间两端的端点函数值符号需要反向:
y=@(x)sin(x)+cos(x).^2
[x,fval]=fzero(y,[-11])%fzero在[-1,1]这个区间搜索初值
3.fsolve
fsolve可以求解多元方程,用法和fzero类似。
fsolve的常用形式:
x=fsolve(fun,x0)
[x,fval]=fsolve(fun,x0)
其中fun为函数句柄,x0为搜索初值,fval为求解误差
例:求解方程组x+y=1,x-11y=5
eq=@(x)[x(1)+x(2)-1;x(1)-11*x(2)-5][sol,fval]=fsolve(eq,[1,1])
这里对于方程的的输入需要采用矩阵的形式,其中x(1)代表x,x(2)代表y。有时候变量较多时可能会容易混淆,这里提供另一种方法,采用符号变量形式再利用matlabFunction转化为函数句柄:
symsxy
eq1=x+y-1eq2=x-11*y-5eq1=matlabFunction(eq1);%将符号函数转化为函数句柄eq2=matlabFunction(eq2);
eq=@(x)[eq1(x(1),x(2));
eq2(x(1),x(2))][sol,fval]=fsolve(eq,[1,1])
4.vpasolve
最后再补充一个数值解法vpasolve,vpasolve是R2012b引进的函数,可以求解一元或多元函数零点。相比于fzero和fsolve来说,vpasolve最大的一个优点就是不需要提供初值,并且能够自动搜索指定范围内的多个解。
vpasolve调用形式:
S=vpasolve(eqn)
S=vpasolve(eqn,var)
S=vpasolve(eqn,var,init_guess)
___=vpasolve(___,Name,Value)
其中eqn是符号方程,var为需要求解的变量,也可以不提供(第一种形式,这是默认求解变量由symvar(eqn)求得),init_guess为搜索初值,Name,Value为一些选项控制。
例:对于多项式方程,vpasolve能够给出所有解:
symsxvpasolve(4*x^4+3*x^3+2*x^2+x+5==0,x)
对于非多项式方程,vpasolve给出它找到的第一个解:
symsxvpasolve(sin(x^2)==1/2,x)