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