matlab中利用 solve,fzero,fsolve解方程問題


http://blog.sina.com.cn/s/blog_4c4af5c101008w9f.html

 

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等等。
 


*非線性方程數值求解


*fzero單變量非線性方程求解


    在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。
    

function fx=funx(x)
    fx=x-10.^x+2;

 

 (2) 調用fzero函數求根。
    

z=fzero('funx',0.5)
    z =
       0.3758

 

 

**fsolve非線性方程組的求解


    對於非線性方程組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。

function q=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

    可見得到了較高精度的結果。

 

自己的總結

solve()函數的輸入是符號表達式(symbolic expression),必然要用到符號工具箱

fzero()和fsolve()函數的輸入是函數句柄,除了利用編寫function的m文件外,還可以利用構造隱函數的方法構造函數句柄(function handle),這樣就不用再另外編寫m文件,但是當碰到多解的問題時,我們無法讓solve返回我們想要的值,solve只能返回一個解,而這個解是我們無法自定義的,而fsolve和fzero函數我們可以通過選擇初始的迭代點來選擇我們想要的解。

例如

利用solve函數

x=0:0.001:0.5;
y1=11.61*x-5.8;
y2=2*log(x)/log(10);
plot(x,y1,'*',x,y2,'P')
[x,y]=solve('y=11.61*x-5.8','y=2*log(x)/log(10)')
 
             

利用fzero函數解決該問題

f1 = @(x) 11.61*x-5.8;%表達式1

f2 = @(x) 2*log10(x);%表達式2


xs = (0:0.001:0.5).';
y1s = f1(xs);
y2s = f2(xs);
plot(xs,y1s,'*',xs,y2s,'P') %繪制函數圖形

eqn = @(x) f1(x)-f2(x); %
result_x1 = fzero(eqn, 0.4)
result_y1 = f1(result_x1)
result_x2 = fzero(eqn, 1e-2)
result_y2 = f1(result_x2)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM