fsolve传递未知参量解方程.docx

上传人:b****5 文档编号:5648814 上传时间:2022-12-30 格式:DOCX 页数:9 大小:18.83KB
下载 相关 举报
fsolve传递未知参量解方程.docx_第1页
第1页 / 共9页
fsolve传递未知参量解方程.docx_第2页
第2页 / 共9页
fsolve传递未知参量解方程.docx_第3页
第3页 / 共9页
fsolve传递未知参量解方程.docx_第4页
第4页 / 共9页
fsolve传递未知参量解方程.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

fsolve传递未知参量解方程.docx

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

fsolve传递未知参量解方程.docx

fsolve传递未知参量解方程

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])

以matlabR2008a版本为例,各版本出错提示可能有所不同。

有不对之处,欢迎指正。

1.solve和fsolve的基本含义

matlab给出的关于solve和fsolve的基本描述为:

solve——Symbolicsolutionofalgebraicequations

fsolve——Solvesystemofnonlinearequations

可见solve用于解决代数方程(组)的符号(解析)解,而fsolve用来解决非线性方程(组)的数值解。

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

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

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

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

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

fminbnd,fminsearch,fmincon等等。

】(引自:

下面举几个例子:

1例1:

>>solve('a*x-1')

2ans=

31/a

4例2:

>>solve('exp(x)+sin(x)-2')

5ans=

6.44867191635127271149118657202662

注:

对于solve结果的显示,有时看起来比较长,可用vpa进行精度控制,如:

>>vpa(solve('exp(x)+sin(x)-2'),3)

ans=

.449

7例3:

>>fsolve(@(x)exp(x)+sin(x)-2,0)

8Optimizationterminated:

first-orderoptimalityislessthanoptions.TolFun.

9ans=

100.4487

2.关于solve和fsolve求解方程组时的书写规则

对于solve,方程可以直接书写,不需要运算符”.”;

对于fsolve,当未知量与未知量有乘除操作或未知量有开方、幂等操作时运算符”.”可写也可不写(记得好像必须写,试了试,发现不写也行)。

下面举几个例子:

11例4:

>>solve('x+y.^2-1','x.^2-y-3')

12?

?

?

Errorusing==>solveat77

13'x+y.^2-1'isnotavalidexpressionorequation.

14例5:

>>solve('x+y^2-1','x^2-y-3')

15ans=

16x:

[4x1sym]

17y:

[4x1sym]

18例6:

functionshiyan

19clc

20clear

21x0=[0,0];

22fsolve(@mf,x0)

23

24functionF=mf(x)

25F=[x

(1)+x

(2)^2-1;

26x

(1)^2-x

(2)-3];

27%%%%%Result%%%%%%

28Optimizerappearstobeconvergingtoaminimumthatisnotaroot:

29Sumofsquaresofthefunctionvaluesis>sqrt(options.TolFun).

30Tryagainwithanewstartingpoint.

31ans=

321.6268-0.1537

例7:

把例6中的mf函数,换成如下再试试。

functionF=mf(x)

F=[x

(1)+x

(2).^2-1;

x

(1).^2-x

(2)-3];

例8:

把例6的初值x0设为x0=[-2,2];运行结果为:

Optimizationterminated:

first-orderoptimalityislessthanoptions.TolFun.

ans=

-2.1875

1.7854

可见,用fsolve解非线性方程组,比较依赖处置的选择,因此建议用fsolve解方程时,能大致了解问题的求解区间,以便选择合适的初值。

3.关于solve和fsolve求解时,参数为多数值的求解

问题来源:

类似问题描述:

k=(5.0e+4):

(1e+3):

(6e+4);h=1.6e-6;n1=2.2899;n0=1.5040;n2=1.000;解方程组:

p1=sqrt(k.^2.*n1.^2-b.^2;p2=sqrt(b.^2-k.^2.*n2.^2);p0=sqrt(b.^2-k.^2.*n0.^2);

p1*h-pi-atan(p0./p1)-atan(p2./p1)=0。

(见:

解决方法:

这是非线性方程组,不过我们可以先用solve试试:

33例9:

问题如前所述。

考虑用solve是否能解。

34clear

35clc

36k=(5.0e+4):

(1e+3):

(6e+4);

37h=1.6e-6;

38n1=2.2899;

39n0=1.5040;

40n2=1.000;

41fori=1:

length(k)

42y=solve(['p1=sqrt(',num2str(k(i)),'^2*',num2str(n1),'^2-b^2)'],...

43['p2=sqrt(b^2-',num2str(k(i)),'^2*',num2str(n2)','^2)'],...

44['p0=sqrt(b^2-',num2str(k(i)),'^2.*',num2str(n0),'^2)'],...

45['p1*',num2str(h),'-',num2str(pi),'-atan(p0/p1)-atan(p2/p1)=0']);

46end

%%%%%Result%%%%%

>Insolveat140

Inshiyanat9

y=solve(['p1=sqrt(',num2str(k(i)),'^2*',num2str(n1),'^2-b^2)'],...

['p2=sqrt(b^2-',num2str(k(i)),'^2*',num2str(n2)','^2)'],...

['p0=sqrt(b^2-',num2str(k(i)),'^2.*',num2str(n0),'^2)'],...

['p1*',num2str(h),'-',num2str(pi),'-atan(p0/p1)-atan(p2/p1)=0']);

Warning:

Warning,solutionsmayhavebeenlost

Warning:

Explicitsolutioncouldnotbefound.

>>whosy

NameSizeBytesClassAttributes

y0x064sym

由此说明利用solve并不能解决这个复杂的非线性方程组,考虑数值解法。

47例10:

问题如例9,考虑fsolve求解问题。

48%主程序

49clear

50clc

51globalkhn1n2n0

52k1=(5.0e+4):

(1e+3):

(6e+4);

53h=1.6e-6;

54n1=2.2899;

55n0=1.5040;

56n2=1.000;

57x0=[0100];

58b=zeros(1,length(k1));

59fori=1:

length(k1)

60k=k1(i);

61y=fsolve(@myfun,x0);

62b(i)=y(4);

63end

64plot(k1,b);

65%子程序

66functionF=myfun(x)

67globalkhn1n2n0

68%p0p1p2b----x

(1)x

(2)x(3)x(4)

69F=[sqrt(k^2*n1^2-x(4)^2)-x

(2);

70sqrt(x(4)^2-k^2*n2^2)-x(3);

71sqrt(x(4)^2-k^2*n0^2)-x

(1);

72x

(2)*h-pi-atan(x

(1)./x

(2))-atan(x(3)./x

(2))];

73%%%%%Result%%%%%%%%%

74y=fsolve(@myfun,x0);

75Optimizerappearstobeconvergingtoaminimumthatisnotaroot:

76Sumofsquaresofthefunctionvaluesis>sqrt(options.TolFun).

77Tryagainwithanewstartingpoint.

这说明所选初值并不合理。

78例11例10还可以这样改写:

79%主程序

80clear

81clc

82%globalkhn1n2n0

83k1=(5.0e+4):

(1e+3):

(6e+4);

84h=1.6e-6;

85n1=2.2899;

86n0=1.5040;

87n2=1.000;

88x0=[0100];

89b=zeros(1,length(k1));

90fori=1:

length(k1)

91k=k1(i);

92y=fsolve(@(x)myfun(x,k,h,n1,n2,n0),x0);

93b(i)=y(4);

94end

95plot(k1,b);

96%子程序

97functionF=myfun(x,k,h,n1,n2,n0)

98%globalkhn1n2n0

99%p0p1p2b----x

(1)x

(2)x(3)x(4)

100F=[sqrt(k^2*n1^2-x(4)^2)-x

(2);

101sqrt(x(4)^2-k^2*n2^2)-x(3);

102sqrt(x(4)^2-k^2*n0^2)-x

(1);

103x

(2)*h-pi-atan(x

(1)./x

(2))-atan(x(3)./x

(2))];

例12参见

注:

利用fsolve解数值解,初值的选择十分重要。

而1stOpt则对初值的选择要求比较低,不妨一试。

关于这一点,请参考如下文章:

作者:

dingd非线性方程组-1stOpt与fsolve的比较:

solve,fsolve的用法

2007-06-0323:

40:

42|分类:

tech|标签:

tech:

技术类|字号大中小订阅

solve是方程,方程组的符号解法;

fsolve是数值的优化方法;

两种方法各有所长吧。

第一种,幸运的话,可以得到解析解,就是那种符号解;

但是复杂的方程,往往是得不到的。

第二种的话,不出差错的话,总是可以得到一些可用的数值解;

可不要忽略了第二种哦;

举例如下,symsy;

y=solve('(5-y^2)^0.5*(10-y^2)^0.5*besselj(1,(10-y^2)^0.5)*besselj(0,(5-y^2)^0.5)+y^2*besselj(0,(10-y^2)^0.5)*besselj(1,(5-y^2)^0.5)')

是得不到隐式解的;

第二种

定义函数如下

functionf=mytest(x)

f=(5-x^2)^0.5*(10-x^2)^0.5*besselj(1,(10-x^2)^0.5)*besselj(0,(5-x^2)^0.5)+x^2*besselj(0,(10-x^2)^0.5)*besselj(1,(5-x^2)^0.5)

使用

x=fsolve(mytest,1+1i)

或者

x=fsolve(@mytest,1+1i)

都是可以的;

结果如下

f=

-0.0136+0.1593i

f=

-0.0136+0.1593i

f=

0.0235+0.0353i

f=

0.0235+0.0353i

f=

0.0034-0.0046i

f=

0.0034-0.0046i

f=

3.7005e-005+8.2011e-005i

f=

3.6997e-005+8.2015e-005i

f=

1.2868e-008-1.7310e-008i

f=

4.4882e-009-1.3191e-008i

Optimizationterminated:

first-orderoptimalityislessthanoptions.TolFun.

x=

0.7521+1.1982i

========================================================================================

初值的选择是很重要的

如果用

x=fsolve(@mytest,1)

这里用的实数初解,结果很差的

x=

9.6085e-006

=============================================

如果函数改为范数abs的话,结果也是比较差的

functionf=mytest(x)

f=abs((5-x^2)^0.5*(10-x^2)^0.5*besselj(1,(10-x^2)^0.5)*besselj(0,(5-x^2)^0.5)+x^2*besselj(0,(10-x^2)^0.5)*besselj(1,(5-x^2)^0.5))

你可以试试,我是试过了的。

=========================================

更好的初值选择

x=fsolve(@mytest,2+2i)

结果f=

-8.3966e-009+4.1120e-009i

Optimizationterminated:

first-orderoptimalityislessthanoptions.TolFun.

x=

0.7521+1.1982i

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

当前位置:首页 > 考试认证 > 其它考试

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

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