http://blog.sina.com.cn/s/blog_4c4af5c101008w9f.html
matlab里solve如何使用,是否有別的函數可以代替它.
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也不例外,它也只能給出任意非代數方程在某點附近的解,函數有兩個: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)