MATLAB解方程與函數極值


1.線性方程數值求解

  主要是用到了計算方法里的LU分解等,不過是加快了求解速度而已(相對於inv(A)*b或者A\b)

2.非線性方程數值求解

  1 單變量非線性方程求解
    在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

  2 非線性方程組的求解

  對於非線性方程組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
    可見得到了較高精度的結果。

 

3.  常微分方程初值問題的數值解法

  龍格-庫塔法的實現
    基於龍格-庫塔法,MATLAB提供了求常微分方程數值解的函數,一般調用格式為:
    [t,y]=ode23('fname',tspan,y0)
    [t,y]=ode45('fname',tspan,y0)
其中fname是定義f(t,y)的函數文件名,該函數文件必須返回一個列向量。tspan形式為[t0,tf],表示求解區間。y0是初始狀態列向量。t和y分別給出時間向量和相應的狀態向量。

例  設有初值問題,試求其數值解,並與精確解相比較(精確解為y(t)=)。
    (1) 建立函數文件funt.m。
function yp=funt(t,y)
yp=(y^2-t-2)/4/(t+1);
(2) 求解微分方程。
t0=0;tf=10;
y0=2;
[t,y]=ode23('funt',[t0,tf],y0);   %求數值解
y1=sqrt(t+1)+1;             %求精確解
t'
y'
y1'

  y為數值解,y1為精確值,顯然兩者近似。

4.  函數極值
    MATLAB提供了基於單純形算法求解函數極值的函數fmin和fmins,它們分別用於單變量函數和多變量函數的最小值,其調用格式為:
    x=fmin('fname',x1,x2)
    x=fmins('fname',x0)
這兩個函數的調用格式相似。其中fmin函數用於求單變量函數的最小值點。fname是被最小化的目標函數名,x1和x2限定自變量的取值范圍。fmins函數用於求多變量函數的最小值點,x0是求解的初始值向量。

MATLAB沒有專門提供求函數最大值的函數,但只要注意到-f(x)在區間(a,b)上的最小值就是f(x)在(a,b)的最大值,所以fmin(f,x1,x2)返回函數f(x)在區間(x1,x2)上的最大值。

例  求f(x)=x3-2x-5在[0,5]內的最小值點。
    (1) 建立函數文件mymin.m。
function fx=mymin(x)
fx=x.^3-2*x-5;
    (2) 調用fmin函數求最小值點。
x=fmin('mymin',0,5)
x=
    0.8165

5.復數相關

matlab里可以直接輸入數學表達式計算。

空格三個點號為續行符,必須加空格,否則被認為是無法識別的操作符。

可以1 + 4*i或者1 + 4i表示復數,exp(x)表示指數函數。

生成復數陣,每個元素是復數,或者[1 2;4 5] - [7 8; 56 7]*i。

real(實部),imag(虛部),abs(求模),angle(求角)

 1 >> (-8)^(1/3)
 2 
 3 ans =
 4 
 5    1.0000 + 1.7321i
 6  -8^(1/3)
 7 
 8 ans =
 9 
10     -2
11 
12 
13 
14 因為計算是按復數計算,在復數面內旋轉-1/3圈,即順時針三分之一圈,所以得到1.0000 + 1.7321i
15 使用時注意就可以了

 6.matlab中畫的圖形想要加上網格線,須先plot在grid,順序反了和沒加grid一樣。

畫出衰減振盪曲線及其它的包絡線。

1 t=0:pi/50:4*pi; 
2 y0=exp(-t/3);  
3 y=exp(-t/3).*sin(3*t); 
4 plot(t,y,'-r',t,y0,':b',t,-y0,':b') 
5 grid  

7.eps是matlab中最小的正數。eps=2.22044604925031e-016
在matlab的數值計算中,當發現某個值小於eps時,就把這個數當做0來處理。

 

歷史指令再運行(選擇全部需要的代碼,右鍵選擇evaluate section)。

8.

 

 

 

 

 

 

 

  


免責聲明!

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



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