主要內容(大概)
一、微分方程(組)求解: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:求解下列微分方程的解析解和數值解
(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方程的數值解,並繪製時間響應曲線和轉態軌跡圖
步驟1:轉化爲一階線性微分方程組IVP
降爲一階微分方程組:
初始條件:
解決辦法(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:
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:解微分方程組
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:求下列微分方程組的特解
,初始條件爲
步驟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:求一元二次方程 的根
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:求解方程組
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:求解方程
錯誤做法:
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:求解方程組
繪圖:
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裏,多項式用行向量表示,其元素爲多項式的係數,並從左至右按降冪排列。
=>
如:
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(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
例:求方程 的所有根
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.