Matlab學習筆記(四)

主要內容(大概)

一、微分方程(組)求解:desolve、ode45、ode23、ode15s
二、代數方程(組)求根:solve、fzero、fsolve
三、多項式的表示、四則運算:poly2sym、poly_add、conv、deconv
四、有理函數的分解:residue

目錄

微分方程(組)求解
代數方程(組)求根
多項式的表示、四則運算

微分方程(組)求解

用Matlab求解常微分方程(組)
1、符號命令

dsolve(‘方程1’, ‘方程2’,…‘方程n’, ‘初始條件’, ‘自變量’)

2、數值命令

[t, x]=solver(’f’, ts, x0, options) % 這裏的solver可以是ode45 ode23 ode15s

ode23比ode45更快,ts是解的區間,
x0是應變量初值(可能是向量)對應於結果的x,options是誤差

一階常微分方程IVP
例1:求解下列微分方程的解析解和數值解

y=y2xy,y(0)=1,0<x<4y'=y-\frac{2x}{y}, y(0)=1,0<x<4

(1)解析解

clear
dsolve('Dy = y - 2*x/y', 'y(0) = 1', 'x')
% 結果
ans = (2*x + 1)^(1/2)

(2)數值解

clear
odefun = @(t,y) y-2*t/y; % 定義局部函數
[t, Y] = ode45(odefun, 0:0.1:4, 1); % 調用Matlab命令
plot(t, Y, 'o-') %畫數值解的圖
hold on
t1 = 0:0.1:4; y1 = sqrt(1+2*t1); % 畫解析解的圖
plot(t1, y1, '*-')

在這裏插入圖片描述
著名的Van der Pol方程
例:求著名的Van der Pol方程的數值解,並繪製時間響應曲線和轉態軌跡圖

y+(y21)y+y=0,y(0)=0.25,y(0)=0y''+(y^2-1)y'+y=0,y(0)=0.25,y(0)'=0

步驟1:轉化爲一階線性微分方程組IVP

:y1=y,y2=y˙令:y_{1}=y,y_{2}=\dot{y}

降爲一階微分方程組:

Y˙=[y1˙y2˙]=[y2˙(y121)y2y1]\dot{Y}=\begin{bmatrix} \dot{y_{1}}\\\dot{y_{2}} \end{bmatrix} = \begin{bmatrix} \dot{y_{2}}\\-(y_{1}^{2}-1)y_{2}-y_{1} \end{bmatrix}

初始條件:

Y0=[y1(0)y2(0)]=[0.250]Y_{0}=\begin{bmatrix} y_{1}(0)\\y_{2}(0) \end{bmatrix} = \begin{bmatrix} 0.25\\0\end{bmatrix}

解決辦法(ode45的方法(主程序+子程序))
子程序:

% 子程序 (程序名:dYdt.m)
function Ydot = dYdt(t, Y)
Ydot = [Y(2); -Y(2)*(Y(1).^2-1)-Y(1)];
% 或寫爲:
function Ydot = dYdt(t, Y)
Ydot = zeros(size(Y));
Ydot(1) = Y(2);
Ydot(2) = -Y(2)*(Y(1).^2-1)-Y(1);

主程序:

% 主程序 (程序名:VanderPol_ex1.m)
[t, Y] = ode45('dYdt', [0: 0.01: 20], [0.25; 0], 1e-6);
subplot(1, 2, 1), plot(t, Y) %解的曲線
subplot(1, 2, 2), plot(Y(:, 1), Y(:, 2)) %Y(:, 1)取第一列

在這裏插入圖片描述
例2:

{d2xdt21000(1x2)dxdtx=0x(0)=2;x(0)=0\left\{\begin{matrix} \frac{\mathrm{d^{2}} x}{\mathrm{d} t^{2}}-1000(1-x^2)\frac{\mathrm{d} x}{\mathrm{d} t}-x=0\\ x(0)=2;x'(0)=0 \end{matrix}\right.

:y1=x,y2=y1令:y_{1}=x,y_{2}=y_{1}'

{y1=y2y2=1000(1y1)y2y1y1(0)=2,y2(0)=0\left\{\begin{matrix} y_{1}'=y_{2}\\y_{2}=1000(1-y_{1})y_{2}-y_{1} \\ y_{1}(0)=2,y_{2}(0)=0 \end{matrix}\right.

1.建立m文件(C-N快捷鍵新建或edit命令),vdp1000.m如下:

function  dy = vdp1000(t, y)
dy = zeros(2, 1); % 2行一列的0矩陣
dy(1) = y(2); % 賦值?
dy(2) = 1000*(1-y(1)^2)*y(2)-y(1);

2.取t0 = 0,t1 = 3000,輸入命令

[T, Y] = ode15s('vdp1000', [0 3000], [2 0]);
plot(T, Y(:, 1), '-')

3.結果如圖
在這裏插入圖片描述
例3:解微分方程組

{y1=y2y3y2=y1y3y3=0.51y1y2y1(0)=0,y2(0)=1,y3(0)=1\left\{\begin{matrix}y_1'=y_2y_3 \\ y_2'=-y_1y_3 \\ y_3'=-0.51y_1y_2 \\ y_1(0)=0,y_2(0)=1,y_3(0)=1 \end{matrix}\right.

1.建立m文件rigid.m如下:

function dy = rigid(t, y)
dy = zeros(3, 1);
dy(1) = y(2)*y(3);
dy(2) = -y(1)*y(3);
dy(3) = -0.51*y(1)*y(2);

2.取t0 = 0,t1=12,輸入命令:

[T, Y] = ode45('rigid', [0 12], [0 1 1]);
plot(T, Y(:, 1), '-', T, Y(:, 2), T, Y(:, 3))

3.結果如圖:
在這裏插入圖片描述
例3:求下列微分方程組的特解

{dxdt=2x3y+3zdydt=4x5y+3zdzdt=4x4y+1z\left\{\begin{matrix}\frac{\mathrm{d} x}{\mathrm{d} t} = 2x-3y+3z \\ \frac{\mathrm{d} y}{\mathrm{d} t} = 4x-5y+3z \\ \frac{\mathrm{d} z}{\mathrm{d} t} = 4x-4y+1z \end{matrix}\right.,初始條件爲{x(0)=2y(0)=3z(0)=100\left\{\begin{matrix}x(0)=2 \\ y(0)=3 \\ z(0)=100 \end{matrix}\right.

步驟1,寫子程序:

function dy = fc(t, y)
dy = zeros(size(y));
dy(1) = 2*y(1) - 3*y(2) + 3*y(3);
dy(2) = 4*y(1) - 5*y(2) + 3*y(3);
dy(3) = 4*y(1) - 4*y(2) + 2*y(3);

步驟2,寫主程序:

[t, dy] = ode45('fc', [0 1], [2 3 100]);
plot(t, dy(:, 1), 'g', t, dy(:, 2), 'b+', t, dy(:, 3), 'r*')

在這裏插入圖片描述

代數方程(組)求根

1、符號命令

syms x
solve(Fun1, Fun2, ..., x1, x2, ...) % 返回 Fun 符號或精確根

2、數值命令1

x = fzero(Fun, x0) % 返回x0附近零點
x = fzero(Fun, [a, b]) % 返回[a, b]間一個零點,Fun端點異號

3、數值命令2

[x, f, h] = fsolve(Fun, x0) % 返回 Fun 符號解或精確根

注意:h>0,結果可靠;h<0,結果不可靠
fzero使用要慎重,方程組不適用,只能求單個
數值命令使用的時候:Fun要用inline、@或自定義
數值解,優先使用fsolve(方程組求解),fzero不推薦使用條件苛刻
簡單方程使用符號命令,solve比較精確
符號解
例1:求一元二次方程 ax2+bx+c=0ax^2+bx+c=0 的根

syms x a b c;
f = a*x^2 + b*x + c;
solve(f), solve(f, a) %第二個參數可以指定未知數
% 結果
ans =  -(b + (b^2 - 4*a*c)^(1/2))/(2*a)
       -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
ans = -(c + b*x)/x^2

例2:求解方程組 {x2y=ax+y=b\left\{\begin{matrix}x^2-y=a \\ x+y=b \end{matrix}\right.

syms x y a b
[x, y] = solve(x^2-y-a, x+y-b, x, y)
% 結果
x = (4*a + 4*b + 1)^(1/2)/2 - 1/2
    - (4*a + 4*b + 1)^(1/2)/2 - 1/2
 
 
y = b - (4*a + 4*b + 1)^(1/2)/2 + 1/2
    b + (4*a + 4*b + 1)^(1/2)/2 + 1/2

數值解
例1:求解方程 sin(4x)=ln(x)sin(4x) = ln(x)

錯誤做法:

syms x
y = solve(sin(4*x) - log(x), x)
%結果
警告: Unable to solve symbolically. Returning a numeric solution using vpasolve. 
> In solve (line 304) 
y = - 227.5052470321715202967611647339 - 0.63142516921359725860486070631205i

正確做法:

% 先畫圖看一看
x = 0.1: 0.1: 4;
y = sin(4*x) - log(x); plot(x, y); grid on

在這裏插入圖片描述

f = inline('sin(4*x) - log(x)', 'x');
y1 = fzero(f, 0.7)
y2 = fzero(f, [0.5, 1])
[x, f, h] = fsolve(f, 0.7) %錯誤寫法:y2 = fzero(f, [0.5, 2]) 端點取值要異號
% 結果
x = 0.8317
f = 1.3518e-12
h = 1

例2:求解方程組 {x2y3=0exy=0\left\{\begin{matrix}x^2-y^3=0 \\ e^{-x}-y=0 \end{matrix}\right.
繪圖:

ezplot('exp(-x) - y'); hold on
ezplot('x^2 - y^3')

在這裏插入圖片描述
法1:

clear
fun = inline('[t(1)^2-t(2)^3, exp(t(1))-t(2)]', 't');
% 或 fun = @(t)[t(1)^2-t(2)^3, exp(t(1))-t(2)]
t0 = [1, 1];
[t, f, h] = fsolve(fun, t0)
% 結果
t = -0.4839    0.6164
f = 1.0e-09 *
    0.5039    0.3347
h = 1

法2:
步驟1,編寫fun.m:

function y = fun(t)
y(1) = t(1)^2 - t(2)^3;
y(2) = exp(-t(1))-t(2);

步驟2,求解:

[t, f, h] = fsolve('fun', [1, 1])
% 結果
t = 0.4839    0.6164
f = 1.0e-09 *
    0.3639    0.1988
h =  1

多項式的表示、四則運算

1.多項式表示及求值

poly2sym(c); % 多項式函數p(x)的表達式,缺省的自變量爲x
polyval(c,a); % 多項式函數p(x)在x=a時的值

2.多項式求根

roots(c); % 多項式函數p(x)=0時的所有根(複數域)

3.多項式運算

poly_add(c1, c2); % 兩個多項式和差運算
a = conv(a, b); % 多項式相乘,返回係數向量
[q, r] = deconv(b, v); % 兩個多項式相除,返回商的係數
						% vector(q)和餘數係數vector(r)
						% q -> 商; r -> 餘數

冪係數:在MATLAB裏,多項式用行向量表示,其元素爲多項式的係數,並從左至右按降冪排列。
p(x)=c1xn+c2xn1+...+cnx+cn+1p(x)=c_1x^n+c_2x^{n-1}+...+c_nx+c_{n+1} => c=[c1,c2,...,cn,cn1]c=[c_1, c_2, ..., c_n, c_{n-1}]
如:

c = [2 1 4 5];
poly2sym(c)
% 結果
ans = 2*x^3 + x^2 + 4*x + 5
t = sym('t'); % 需要給變量t定義爲符號變量
poly2sym(c, t)
ans = 2*t^3 + t^2 + 4*t + 5

多項式函數在點a的值:polyval(p, a)
例:p(x)=3x47x3+2x2+x+1p(x)=3x^4-7x^3+2x^2+x+1,計算p(2.5)

c = [3, -7, 2, 1, 1];
xi = 2.5;
yi = polyval(c, xi) 
% 結果
yi = 23.8125

如果xi是含有多個橫座標值的數組,則yi也爲與xi長度相同的向量。

c=[3,-7,2,1,1];  xi=[2.5,3];
yi=polyval(c,xi)
% 結果
yi = 23.8125   76.0000

多項式求根roots
例:求方程 2x3+x2+4x+5=02x^3+x^2+4x+5=0 的所有根

c = [2 1 4 5]
roots(c);
roots([2 1 4 5])
% 結果
ans = 0.2500 + 1.5612i
      0.2500 - 1.5612i
     -1.0000 + 0.0000i

多項式的和與差:poly_add

b = poly_add(c,b);  % 求兩個多項式的和
b = poly_add(c,-b); % 多項式p1(x)減去p2(x)
				  % 其中b是求和後多項式的係數矩陣。

兩個多項式的乘積與商:conv; deconv
m階多項式與n階多項式的乘積是d=m+n階的多項式
a=conv(c,b);%多項式相乘,返回係數向量

a=[2,-5,6,-1,9]; b=[3,-90,-18];
c=conv(a,b)
% 結果
c = 6  -195   432  -453     9  -792  -162

[q, r]=deconv(b,c);%兩個多項式相除,返回商的係數vector(q)和餘數係數vector(r)
即 b=conv(q,c)+r

a=[2,-5,6,-1,9]; b=[3,-90,-18];
c=conv(a,b)
% 結果
c = 6  -195   432  -453     9  -792  -162

點我回頂部

 
 
 
 
 
 
 
Fin.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章