每日签到积分充值书码绑定

MATLAB技术论坛

 找回密码
 注册帐号

QQ登录

只需一步,快速开始

查看: 9491|回复: 13

[教程] 【原创】线性/非线性方程(组)的MATLAB解法汇总 [复制链接]

管理员

风雪夜归人

Rank: 30Rank: 30Rank: 30Rank: 30

签到天数: 12 天

[LV.3]偶尔看看II

UID
1
主题
1390
帖子
5053
积分
70501
威望
778
贝壳
53863
贡献
4889

管理团队 技术小组 原创先锋 宣传大使

发表于 2009-2-7 09:16:57 |显示全部楼层 | 百度  谷歌 |
线性方程的MATLAB求解专题讲解,请参见http://www.matlabsky.com/thread-550-1-1.html

1.roots求解多项式的根

r=roots(c)
注意:c为一维向量,者返回指定多项式的所有根(包括复根),poly和roots是互为反运算,还有就是roots只能求解多项式的解

还有下面几个函数poly2sym、sym2poly、eig

>>syms x
>>y=x^5+3*x^3+3;
>>c=sym2poly(y);%求解多项式系数
>>r=roots(c);
>>poly(r)

2.residue求留数

[r, p, k] = residue(b,a)
>>b = [ 5 3 -2 7]
>>a = [-4 0 8 3]
>>[r, p, k] = residue(b,a)

3.solve符号解方程(组)——使用最多的

g = solve(eq1,eq2,...,eqn,var1,var2,...,varn)

注意:eqn和varn可以是符号表达式,也可以是字符串表达式,但是使用符号表达式时不能有“=”号,假如说varn没有给出,使用findsym函数找出默认的求解变量。返回的g是一个结构体,以varn为字段。由于符号求解的局限性,好多情况下可能得到空矩阵,此时只能用数值解法

解方程A=solve('a*x^2 + b*x + c')

解方程组B=solve('a*u^2 + v^2', 'u - v = 1', 'a^2 - 5*a + 6')

4.fzero数值求零点

[x,fval,exitflag,output]=fzero(fun,x0,options,p1,p2...)

fun是目标函数,可以是句柄(@)、inline函数或M文件名  
x0是初值,可以是标量也可以是长度为2的向量,前者给定一个位置,后者是给定一个范围
options是优化参数,通过optimset设置,optimget获取,一般使用默认的就可以了,具体参照帮助
p1,p2...为需要传递的其它参数

假如说(x/1446)^2+p/504.1+(t/330.9)*(log(1-x/1446)+(1-1/5.3)*x/1446)=0的根,其中p,t是已知参数,但是每次都改变

那么目标函数如下三种书写格式,效果完全等效。注意参数列表中,未知数一定放第一位,其他参数放后面
(1)objfun=@(x,p,t)(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446);
(2)objfun=inline('(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446)','x','p','t')

此时的调用格式如下
fzero(objfun,x0,options,p,t)%如果options使用的默认的话,那直接使用[],p和t就是我们需要传递的参数
fzero(@(x)objfun(x,p,t),x0,options)%这种格式与上面的等效
区别就是前者,将参数p和t作为fzero的参数进行传递,而后者是将p和t作为objfun的参数进行传递,没有本质区别

(3)function f=objfun(x,p,t)%以M文件格式书写目标函数
   f=(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446);

此时有三种调用格式
fzero(@objfun,x0,options,p,t)
fzero('objfun',x0,options,p,t)
fzero(@(x)objfun(x,p,t),x0,options)

注意:fzero只能求解单变量的方程,没法求解复数、多变量以及方程组等。在搜索过程中出现inf,nan,复数将会终止计算,也就是说不能求解复数解,并且每次子返回一个解

5.fsolve数值解方程(组)——使用最多的数值解法

[x,fval,exitflag,output,jacobian]=fsolve(fun,x0,options,p1,p2...)

fsolve的参数意义大部分与fzero相同,只是优化参数更多了,使用更灵活另外一定注意x0的长度必须与变量的个数相等。它与fzero的区别是,首先当然算法不同,另外fsolve的功能强大多很多,它可以直接方便的求解多变量方程组,线性和非线性,超静定和静不定方程,还可求解复数方程

fun同样可以是句柄、inline函数或M文件,但是一般M文件比较多,这是由于fsolve是解方程组的,目标函数一般比较烦,直接写比较困难

比如解方程组x1+x2=8 x1-2*x2-2*p=0(当然可以求解非线性的)

目标函数同样有三种书写格式
(1)objfun=@(x,p)[x(1)+x(2)-8;x(1)-3*x(2)+2*p];
(2)objfun=inline('[x(1)+x(2)-8;x(1)-3*x(2)+2*p]','x','p')

此时的调用格式有
fsolve(objfun,x0,options,p)
fsolve(@(x)objfun(x,p),x0,options)

(3)function f=objfun(x,p)
   f(1)=x(1)+x(2)-8;
   f(2)=x(1)-3*x(2)+2*p;

当然你也可以直接写成,两者的效果是一样的

   f=[x(1)+x(2)-8;
     x(1)-3*x(2)+2*p];

此时的调用格式有
fsolve(@objfun,x0,options,p)
fsolve('objfun',x0,options,p)
fsolve(@(x)fun(x,p),x0,options)

Rank: 1

该用户从未签到

UID
1380
主题
0
帖子
1
积分
18
威望
0
贝壳
17
贡献
0
发表于 2009-3-1 09:54:52 |显示全部楼层

版主帮我看看这个方程:

0=1/(4*3.14159)*6.626068e-34*3e8/656.28e-9*NH*0.411e8-90;
0=1/(4*3.14159)*6.626068e-34*3e8/645.6e-9*NO*0.0331e8-20;
0=2(2*pi*1.672e-27*1.38066e-23*T)^(3/2)/(6.626068e-34)^3*exp(-97536/(1.38066e-23*T))-Ne*NHp/NH;
0=2(2*pi*2.657e-26*1.38066e-23*T)^(3/2)/(6.626068e-34)^3*exp(-102117/(1.38066e-23*T))-Ne*NOp/NO;
0=NHp+NOp-Ne;
0=(NH+NHp)/(NO+NOp)-2;

这样的方程怎么解比较好?谢谢版主!

[ 本帖最后由 littroal 于 2009-3-1 09:58 编辑 ]

道具 举报

Rank: 1

该用户从未签到

UID
20045
主题
1
帖子
5
积分
24
威望
0
贝壳
11
贡献
2
发表于 2009-9-10 10:10:16 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
请教个问题:
关于非线性方程组的求解,用fsolve()函数,其解取决于初值,若不知道方程解得范围,初值怎么定?再者,若稍微变化初值(如0.01),其结果变化很大,初值又如何选?

道具 举报

Rank: 1

该用户从未签到

UID
16593
主题
0
帖子
22
积分
55
威望
0
贝壳
18
贡献
6
发表于 2009-9-10 10:14:45 |显示全部楼层

道具 举报

本科

菜鸟

Rank: 5Rank: 5Rank: 5

签到天数: 76 天

[LV.6]常住居民II

UID
31372
主题
3
帖子
358
积分
1102
威望
0
贝壳
461
贡献
650
发表于 2010-1-6 20:35:11 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
请教个问题:
关于非线性方程组的求解,用fsolve()函数,其解取决于初值,若不知道方程解得范围,初值怎么 ...
清茗 发表于 2009-9-10 10:10



   我也关心这个问题。期盼解答

道具 举报

本科

菜鸟

Rank: 5Rank: 5Rank: 5

签到天数: 76 天

[LV.6]常住居民II

UID
31372
主题
3
帖子
358
积分
1102
威望
0
贝壳
461
贡献
650
发表于 2010-1-6 22:23:23 |显示全部楼层

道具 举报

Rank: 1

该用户从未签到

UID
33836
主题
1
帖子
9
积分
27
威望
0
贝壳
5
贡献
10
发表于 2010-2-9 09:20:29 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
syms a1 b1 a2 b2 a x y real
a=48.9
[x,y]=solve('(x+4.9)^2+(y-18.67)^2=a^2','(x-0.97)^2+(y-11.8)^2=a^2');
a1=MAX(x)
b1=MAX(y)
[x,y]=solve('(x-0.97)^2+(y-11.8)^2=a^2','y=0.8*48.9');
a2=MAX(x)
b2=0.8*48.9;
楼主能否帮忙看看这段程序是否有问题,我这里谢谢了。如有其它要求,请提出来,好吗!

道具 举报

幼儿园

student

Rank: 1

该用户从未签到

UID
54475
主题
0
帖子
12
积分
37
威望
0
贝壳
10
贡献
12
发表于 2010-7-9 12:47:55 |显示全部楼层

道具 举报

Rank: 15Rank: 15Rank: 15

签到天数: 174 天

[LV.7]常住居民III

UID
42271
主题
14
帖子
800
积分
3887
威望
62
贝壳
1749
贡献
3137
发表于 2010-7-16 22:19:47 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
syms a1 b1 a2 b2 a x y real
a=48.9
[x,y]=solve('(x+4.9)^2+(y-18.67)^2=a^2','(x-0.97)^2+(y-11.8)^2= ...
tangzhen 发表于 2010-2-9 09:20



solve({(x+4.9)^2+(y-18.67)^2=a^2,(x-0.97)^2+(y-11.8)^2=a^2},{x,y});
solve({(x+4.9)^2+(y-18.67)^2=a^2,(x-0.97)^2+(y-11.8)^2=a^2},{x,y}) assuming a=48.9
solve({(x-0.97)^2+(y-11.8)^2=a^2,y=0.8*48.9},{x,y});
solve({(x-0.97)^2+(y-11.8)^2=a^2,y=0.8*48.9},{x,y}) assuming a=48.9

MuPAD教程图片.PNG

道具 举报

硕士

道长

Rank: 6Rank: 6

签到天数: 263 天

[LV.8]以坛为家I

UID
16218
主题
1
帖子
719
积分
3026
威望
0
贝壳
1456
贡献
1926
发表于 2010-8-19 09:25:27 |显示全部楼层
这个汇总写得好  不用再去东找西找各种解发了   哈哈

道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

关闭

站长推荐

MATLAB技术论坛数据挖掘公开课开课啦!
MATLAB技术论坛数据挖掘公开课开课啦!
MATLAB技术论坛将为大家奉献N期MATLAB数据挖掘公开课。公开课的安排为综合篇+专题篇,现在第一期数据挖掘概论已经出来了,更多视频敬请关注。。。

查看 »

网站简介 | 发展历程 | 特色业务 | 管理团队 | 免责声明 | 广告服务 | 联系我们 | 付款方式 | 友情链接 | 帮助中心

商务合作:455681698   服务邮箱:matlabsky@gmail.com   支付宝:yuthreestone@163.com

合作站点:数模联盟 函数百科 网上商城   出版单位:北航出版社 道然科技   开发平台:Discuz! X2

CopyRight © 2008-2012 迈粉网 ( 陕ICP备08102094号 ) All Rights Reserved

排行热榜|网站地图|手机浏览|管理邮箱||     

GMT+8, 2012-5-19 06:29 , Processed in 0.233201 second(s), 29 queries , Gzip On, Xcache On.

回顶部