matlab解方程.docx

上传人:b****6 文档编号:6175157 上传时间:2023-01-04 格式:DOCX 页数:9 大小:20.06KB
下载 相关 举报
matlab解方程.docx_第1页
第1页 / 共9页
matlab解方程.docx_第2页
第2页 / 共9页
matlab解方程.docx_第3页
第3页 / 共9页
matlab解方程.docx_第4页
第4页 / 共9页
matlab解方程.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

matlab解方程.docx

《matlab解方程.docx》由会员分享,可在线阅读,更多相关《matlab解方程.docx(9页珍藏版)》请在冰豆网上搜索。

matlab解方程.docx

matlab解方程

1、解方程

最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法:

(1)x=inv(A)*b — 采用求逆运算解方程组;

(2)x=A_ — 采用左除运算解方程组。

例:

x1+2x2=8 

2x1+3x2=13

>>A=[1,2;2,3];b=[8;13];

>>x=inv(A)*b 

x = 

   2.00 

   3.00 

>>x=A_

x = 

  2.00

  3.00;

即二元一次方程组的解x1和x2分别是2和3。

对于同学问到的用matlab解多次的方程组,有符号解法,方法是:

先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下:

第一步:

定义变量syms x y z ...;

第二步:

求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN');

第三步:

求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。

如:

解二(多)元二(高)次方程组:

x^2+3*y+1=0

y^2+4*x+1=0

解法如下:

>>syms x y;

>>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0');

>>x=vpa(x,4);

>>y=vpa(y,4);

结果是:

x = 

    1.635+3.029*i

    1.635-3.029*i

    -.283

   -2.987

y = 

    1.834-3.301*i

    1.834+3.301*i

    -.3600

   -3.307。

二元二次方程组,共4个实数根;

还有的同学问,如何用matlab解高次方程组(非符号方程组)?

举个例子好吗?

解答如下:

基本方法是:

solve(s1,s2,…,sn,v1,v2,…,vn),即求表达式s1,s2,…,sn组成的方程组,求解变量分别v1,v2,…,vn。

具体例子如下:

x^2 + x*y + y = 3

x^2 - 4*x + 3 = 0

解法:

>> [x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0')

运行结果为 

x =

     1 3

y =

     1 -3/2

即x等于1和3;y等于1和-1.5

>>[x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3= 0','x','y')

 x =

     1  3

 y =

     1 -3/2

结果一样,二元二方程都是4个实根。

通过这三个例子可以看出,用matlab解各类方程组都是可以的,方法也有多种,只是用到解方程组的函数,注意正确书写参数就可以了,非常方便。

 

citefrom:

2、变参数非线性方程组的求解

对于求解非线性方程组一般用fsolve命令就可以了,但是对于方程组中某一系数是变化的,该怎么求呢?

%定义方程组如下,其中k为变量

functionF=myfun(x,k)

H=0.32;

Pc0=0.23;W=0.18;

F=[Pc0+H*(1+1.5*(x

(1)/W-1)-0.5*(x

(1)/W-1)^3)-x

(2);

  x

(1)-k*sqrt(x

(2))];

%求解过程

H=0.32;

Pc0=0.23;W=0.18;

x0=[2*W;Pc0+2*H];        %取初值

options=optimset('Display','off');

k=0:

0.01:

1;        %变量取值范围[01]

fori=1:

1:

length(k)

kk=k(i);                

x=fsolve(@(x)myfun(x,kk),x0,options);%求解非线性方程组

x1(i)=x

(1);

x2(i)=x

(2);

end

plot(k,x1,'-b',k,x2,'-r');

xlabel('k')

legend('x1','x2')

citefrom:

3、非线性方程数值求解

matlab里solve如何使用,是否有别的函数可以代替它.

matlab里我解y=9/17*exp(-1/2*t)*17^(1/2)*sin(1/2*17^(1/2)*t)=0这样的方程为什么只得到0这一个解,如何可以的到1/2*17^(1/2)*t=n*(pi)这样一族解?

?

 

在matlab里面solve命令主要是用来求解代数方程(即多项式)的解,但是也不是说其它方程一个也不能解,不过求解非代数方程的能力相当有限,通常只能给出很特殊的实数解。

(该问题给出的方程就是典型的超越方程,非代数方程)

从计算机的编程实现角度讲,如今的任何算法都无法准确的给出任意非代数方程的所有解,但是我们有很多成熟的算法来实现求解在某点附近的解。

matlab也不例外,它也只能给出任意非代数方程在某点附近的解,函数有两个:

fzero和fsolve,具体用法请用help或doc命令查询吧。

如果还是不行,你还可以将问题转化为非线性最优化问题,求解非线性最优化问题的最优解,可以用的命令有:

fminbnd,fminsearch,fmincon等等。

 

*非线性方程数值求解

*单变量非线性方程求解

   在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。

该函数的调用格式为:

   z=fzero('fname',x0,tol,trace)

其中fname是待求根的函数文件名,x0为搜索的起点。

一个函数可能有多个根,但fzero函数只给出离x0最近的那个根。

tol控制结果的相对精度,缺省时取tol=eps,trace指定迭代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0。

   例求f(x)=x-10x+2=0在x0=0.5附近的根。

   步骤如下:

(1)建立函数文件funx.m。

   functionfx=funx(x)

   fx=x-10.^x+2;

   

(2)调用fzero函数求根。

   z=fzero('funx',0.5)

   z=

      0.3758

 

**非线性方程组的求解

   对于非线性方程组F(X)=0,用fsolve函数求其数值解。

fsolve函数的调用格式为:

   X=fsolve('fun',X0,option)

其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。

最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。

如果想改变其中某个选项,则可以调用optimset()函数来完成。

例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。

optimset(‘Display’,‘off’)将设定Display选项为‘off’。

   例 求下列非线性方程组在(0.5,0.5)附近的数值解。

   

(1)建立函数文件myfun.m。

functionq=myfun(p)

x=p

(1);

y=p

(2);

q

(1)=x-0.6*sin(x)-0.3*cos(y);

q

(2)=y-0.6*cos(x)+0.3*sin(y);

   

(2)在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。

x=fsolve('myfun',[0.5,0.5]',optimset('Display','off'))

x=

   0.6354

   0.3734

将求得的解代回原方程,可以检验结果是否正确,命令如下:

q=myfun(x)

q=

     1.0e-009*

   0.2375   0.2957

   可见得到了较高精度的结果。

citefrom:

4、fsolve函数解方程

[X,FVAL,EXITFLAG,OUTPUT,JACOB]=FSOLVE(FUN,X0,...)returnsthe

   JacobianofFUNatX. 

 

   Examples

     FUNcanbespecifiedusing@:

        x=fsolve(@myfun,[234],optimset('Display','iter'))

 

   wheremyfunisaMATLABfunctionsuchas:

 

       functionF=myfun(x)

       F=sin(x);

 

   FUNcanalsobeananonymousfunction:

 

       x=fsolve(@(x)sin(3*x),[14],optimset('Display','off'))

 

   IfFUNisparameterized,youcanuseanonymousfunctionstocapturethe

   problem-dependentparameters.Supposeyouwanttosolvethesystemof

   nonlinearequationsgiveninthefunctionmyfun,whichisparameterized

   byitssecondargumentc.HeremyfunisanM-filefunctionsuchas

     

       functionF=myfun(x,c)

       F=[2*x

(1)-x

(2)-exp(c*x

(1))

             -x

(1)+2*x

(2)-exp(c*x

(2))];

           

   Tosolvethesystemofequationsforaspecificvalueofc,firstassignthe

   valuetoc.Thencreateaone-argumentanonymousfunctionthatcaptures

   thatvalueofcandcallsmyfunwithtwoarguments.Finally,passthisanonymous

   functiontoFSOLVE:

 

       c=-1;%defineparameterfirst

       x=fsolve(@(x)myfun(x,c),[-5;-5])

citefrom:

1、 导数

diff(f) ——函数f对符号变量x或字母表上最接近字母x的符号变量求导数;

diff(f,t)——函数f对符号变量t求导数。

例:

 symsabtxy

f=sin(a*x)+cos(b*t);

g=diff(f)

gg=diff(f,t)  %可以看作二元函数求偏导数)

g=

cos(a*x)*a

gg=

-sin(b*t)*b 

用diff(f,2)求二阶导数

例:

 symsabtxy

f=sin(a*x)+cos(b*t);

f=sin(a*x*t)+cos(b*t*x^2)-2*x*t^3;

diff(f,2)

diff(f,t,2) 

ans=

-sin(a*x*t)*a^2*t^2-4*cos(b*t*x^2)*b^2*t^2*x^2-2*sin(b*t*x^2)*b*t

ans=

-sin(a*x*t)*a^2*x^2-cos(b*t*x^2)*b^2*x^4-12*x*t 

当微分运算作用于符号矩阵时,是作用于矩阵的每个元素,如:

 symsax

 a=[sin(a*x),cos(a*x);-cos(a*x),-sin(a*x)]

dy=diff(a) 

a=

[ sin(a*x), cos(a*x)]

[-cos(a*x),-sin(a*x)]

dy=

[ cos(a*x)*a,-sin(a*x)*a]

[ sin(a*x)*a,-cos(a*x)*a] 

2、 积分

int(f)——函数f对符号变量x或接近字母x的符号变量求不定积分;

int(f,t)——函数f对符号变量t求不定积分;

int(f,a,b)——函数f对符号变量x或接近字母x的符号变量求从a到b的定积分;

 int(f,t,a,b)——函数f对符号变量t求从a到b的定积分。

例:

symsax

f=sin(a*x)

g=int(f) 

gg=int(f,a) 

f=sin(a*x)

ff=sin(x^3)

g=-1/a*cos(a*x) 

gg=-1/x*cos(a*x) 

例:

symsax

f=sin(a*x)

g=int(f,0,pi) 

f=

sin(a*x)

g=-(cos(pi*a)-1)/a 

注:

当不定积分无解析表达式时,可用double计算其定积分的数值解。

例:

symx

f=exp(-x^2)

g=int(f)

gg=int(f,0,1)

a=double(gg) 

ans=x

f=exp(-x^2)

g=1/2*pi^(1/2)*erf(x)

gg=1/2*erf

(1)*pi^(1/2)

a=   0.7468 

3、 极限

limit(f)——当符号变量x(或最接近字母x的符号变量)—>0时函数f的极限;

limit(f,t,a)——当符号变量t—>a时,函数f的极限。

例:

symsxta

f=sin(x)/x

g=limit(f)

limit((cos(x+a)-cos(x))/a,a,0)

limit((1+x/t)^t,t,inf) 

f=sin(x)/x

g=1

ans=-sin(x)

ans=exp(x) 

例:

左、右极限的求法

symx

limit(1/x)

limit(1/x,x,0,'left')

limit(1/x,x,0,'right') 

ans=x

ans=NaN

ans=-inf

ans=inf 

4、 级数和

symsum(s,t,a,b)——表示s中的符号变量t从a到b的级数和(t缺省时设定为x或最接近x的字母)

例:

symsxk

symsum(1/x,1,3) 

ans=11/6 

s1=symsum(1/x^2,1,inf)

s2=symsum(x^k,k,0,inf) 

s1=1/6*pi^2

s2=-1/(x-1) 

5、 泰勒(Taylor)多项式

taylor(f,n,a)——函数f对符号变量x(或最接近字母x的符号变量)在a点的n-1阶泰勒多项式(n缺省时值为6,a缺省值为0)

例:

taylor(sin(x)) 

ans=x-1/6*x^3+1/120*x^5 

f=log(x)

s=taylor(f,4,2) 

f=log(x)

s=log

(2)+1/2*x-1-1/8*(x-2)^2+1/24*(x-2)^3 

1、 代数方程

solve(f,t)——对f中的符号变量t解方程f=0(t缺省值为x或最接近x的字母)

例:

symsabxc

f=a*x^2+b*x+c

s=solve(f) 

ss=solve(f,b) 

f=a*x^2+b*x+c

s=

 [1/2/a*(-b+(b^2-4*a*c)^(1/2))]

 [1/2/a*(-b-(b^2-4*a*c)^(1/2))] 

ss=-(a*x^2+c)/x 

注:

求解形如f(x)=q(x)形式的方程,则需要用单引号把方程括起来。

例:

s=solve('cos(2*x)+sin(x)=1') 

s=

[     0]

[    pi]

[1/6*pi]

[5/6*pi] 

例:

求解方程组

[x,y]=solve('x^2+x*y+y=3','x^2-4*x+3=0') 

x=

[1]

[3]

y=

[   1]

[-3/2] 

即解为(1,1)和(3,-3/2)

2、 微分方程

dsolve('S','s1','s2',…,'x')

其中S为方程,s1,s1,s3,…为初始条件,x为自变量。

方程S中用D表示求导数,D2,D3,…表示二阶、三阶等高阶导数;初始条件缺省时,给出带任意常数C1,C2,..的通解;自变量缺省值为t。

也可求解微分方程组。

例:

dsolve('Dy=1+y^2') 

 ans=tan(t+C1) 

y=dsolve('Dy=1+y^2','y(0)=1','x') 

 y=tan(x+1/4*pi) 

x=dsolve('D2x+2*D1x+2*x=exp(t)','x(0)=1','Dx(0)=0') 

 x=1/5*exp(t)+3/5*exp(-t)*sin(t)+4/5*exp(-t)*cos(t) 

S=dsolve('Df=3*f+4*g','Dg=-4*f+3*g')   %解微分方程组

S=

   f:

[1x1sym]

   g:

[1x1sym] 

计算结果返回在一个结构S中,为了看到其中f,g的值,有如下指令

f=S.f

g=S.g 

f=exp(3*t)*(cos(4*t)*C1+sin(4*t)*C2)

g=-exp(3*t)*(sin(4*t)*C1-cos(4*t)*C2) 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1