Professional Documents
Culture Documents
Scilab 教學系列 ∗
中文 Scilab
李運璋 (Scilab 中文開發群)
∗
有關 Scilab 請參考: http://www-rocq.inria.fr/scilab/ 或 ADE 中文 Scilab 主網頁
i JJ ª 目 錄 II
目 錄
目 錄 邊界層問題 . . . . . . . . . . . . . . . . . . . . 30
微分–代數方程式 33
序 1 微分–代數方程式, 使用 dassl 指令 . . . . . . . 34
跨零條件之微分–代數方程式, 使用 dasrt 指令 . 36
一階常微分方程式組–初值問題 2
一階純量微方方程式 . . . . . . . . . . . . . . 5 線性微分及差分方程組模擬簡介 38
一階純量微方方程式, 使用 C 語言 . . . . . . . 6 線性微分系統之時間響應 . . . . . . . . . . . . 39
向量微分程式 . . . . . . . . . . . . . . . . . . 7 線性差分系統之時間響應 . . . . . . . . . . . . 40
矩陣微分方程式 . . . . . . . . . . . . . . . . . 8
跨零條件 . . . . . . . . . . . . . . . . . . . . . 11 Scialb 指令說明 41
隱式微分方程式 . . . . . . . . . . . . . . . . . 14 ode-常微分方程組求解 . . . . . . . . . . . . . 42
利用 ode 指令求解差分方程組 . . . . . . . . . 17 impl-微分-代數方程式 . . . . . . . . . . . . . . 48
bvodeS-bvode 的簡化呼叫版 . . . . . . . . . . . 52
常微分方程式–邊界值問題 19 dassl,dasrl -微分-代數方程式 (differential alge-
兩點式邊界值問題 . . . . . . . . . . . . . . . . 22 braic equation) . . . . . . . . . . . . . . . 57
特徵值問題 . . . . . . . . . . . . . . . . . . . 24 external- Scilab 物件, 外部函數或程序 . . . . . 64
兩個以上解的邊界值問題 . . . . . . . . . . . . 27
多點邊界值問題 . . . . . . . . . . . . . . . . . 29 後記 66
ii JJ ª 目 錄 II
序
1 序
計算工具對科學教育之重要性,就如同紙筆對文化傳承一樣;欠缺這類輔助工具,就無法面對環境所提出之
挑戰。工程師、研究人員因此而失去成長的機會,久而久之也就以為我們的文化並不擅長處理科學事項,只
能接受現況。
計算工具沒有了自主性,科技也就失去了根本,外來科技文化很容易的將我們的環境變成一個殖民地。但
要改變現況並不容易;因為現況既已行之久遠,那麼環境早已具備反撲任何改變它的企圖心。所以我們認為
引入 Scilab 到國內高等教育體系是否能成功,關鍵不僅僅在於理念是否服人,也必須具有持續降低 Scilab 學
習成本之實際行動。這樣才能讓新加入的成員很快就具備對抗環境挑戰的實力而能擺脫工具技術上之箝制。
目前針對碩、博士研究生推廣 Scilab 會比向大學生介紹它容易許多。學生程度上差異只是一個原因,計算
工具能夠減輕研究生之研究課題壓力才是主因。因此要將 Scilab 向下推廣到大學生之間,應讓 Scilab 轉成理
工大學生課堂上的輔助學習工具才易成功,而這須要課堂上授課教師願意配合。
所以我們有一系列針對大學理工課堂上所需的 Scilab 引介文章,希望填補課堂之學理和計算工具之間的空
白處,讓教師和學生都願意推介 Scilab。計畫中的主題如下:
『常微分及差分方程組』、『非線性聯立方程式、最佳化及最小二乘法』、『線性代數』、『機率、統
計』、『控制』、『訊號處理』、
這一系列文章應能彌補 Scilab 線上手冊之不足,使大學生易於接受。也希望能做為下一個階段撰寫高中生
教學文件的參考文章。
1 JJ ª 目 錄 II
一階常微分方程式組--初值問題
2 一階常微分方程式組–初值問題
內容
一階純量微方方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
一階純量微方方程式, 使用 C 語言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
向量微分程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
矩陣微分方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
跨零條件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
隱式微分方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
利用 ode 指令求解差分方程組 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
一階常微分方程組通式 一階常微分方程組之初值問題之通式為:
微分方程組
dy
= f (t, y)
dt
初值條件
y(t0 ) = y0
2 JJ ª 目 錄 II
一階常微分方程式組–初值問題
Y=ode(y0,t0,t,f)
三階常微分方程式
1
f 000 (η) + f (η)f 00 (η) = 0
2
等價於
3 JJ ª 目 錄 II
一階常微分方程式組–初值問題
一階三維常微分方程組
因此本節僅介紹一階微分方程組之計算工具。
4 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.1 一階純量微方方程式
以下列一階純量微方方程式為例,
微分方程組
ẏ = y 2 − y sin(t) + cos(t)
初值條件
y(0) = 0
y0=0;t0=0; // 2. 初始時間及初值
function ydot=f(t,y) // 1. 提供非線性方程式 f t=0:0.1:%pi; // 3. 設定輸出結果之時間
ydot=y^2-y*sin(t)+cos(t) Y=ode(y0,t0,t,f) // 4. 呼叫 ode 指令
endfunction plot(t,Y) // 5. 繪出結果
5 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.2 一階純量微方方程式, 使用 C 語言
6 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.3 向量微分程式
此例,模擬以下之動態系統
微分方程組
ẋ = Ax(t) + Bu(t)
[ ] [ ]
1 1 1
A= ,B =
0 2 1
初值條件
[ ]
1
x(0) =
0
ut=sin(omega*t)
// A 及 u 必須利用串列告知函數原型 endfunction
function xdot=linear(t,x,A,u) A= [1 1;0 2];B= [1;1];omega=5;// 線性系統資訊
xdot=A*x+B*u(t) // B 透過全域變數傳遞 // 在 t=0.1, 0.2, 0.5 ,1. 提供 x(t) 的時刻
endfunction // x0= [1;0] ; 初始值
// omega 透過全域變數傳遞 //最後一參數為串列,提供額外參數 A 及 u 資訊
function ut=u(t) // 輸入函數 X=ode([1;0],0,[0.1,0.2,0.5,1],list(linear,A,u))
7 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.4 矩陣微分方程式
微分方程組
Ẏ = F(t, Y)
初值條件
Y(0) = Y0
8 JJ ª 目 錄 II
一階常微分方程式組–初值問題
Riccati 矩陣微分方程式
Ẋ = AT X + XA − XT BX + C
初值條件
X(0) = I
Scilab 解方程式之指令為:
9 JJ ª 目 錄 II
一階常微分方程式組–初值問題
另一例利用矩陣微分方程式之解
矩陣微分方程式
Ẋ = AX
[ ]
1 1
A=
0 2
初值條件
X(0) = I
求得矩陣之指數, eA ,如下:
A= [1,1;0,2];
function xdot=f(t,x) // 設定矩陣微分方程式
xdot=A*x;
endfunction
ode(eye(A),0,1,f) // 使用內定方法
ode("adams",eye(A),0,1,f) // 選用 "adams" 法
10 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.5 跨零條件
微分方程組
dy
= f (t, y)
dt
初值條件
y(t0 ) = y0
跨零條件
g(t, y) = 0
任一個跨零條件滿足時ode指令即停止計算,同時傳回滿足跨零條件的曲面資訊。
11 JJ ª 目 錄 II
一階常微分方程式組–初值問題
例如以下問題:
微分方程式及初值條件
ẏ = y, y(0) = 1
跨零條件
g =y−2=0
跨零條件,可以為一向量組組,例如將 g 改為
2
g(t, y) = y − 2
33
則 Scilab 指令如下:
//同時設定三個面 y=2,y=2,y=33
deff("[z]=g(t,y)","z=y-[2;2;33]") // 3 階跨零條件
[y,rd]=ode("roots",1,0,2,f,3,g) //
12 JJ ª 目 錄 II
一階常微分方程式組–初值問題
13 JJ ª 目 錄 II
一階常微分方程式組–初值問題
2.6 隱式微分方程式
隱式微分方程組
y=impl(y0,ydot0,t0,t,res,adda)
r = res(t,y,ydot)=g(t,y)-A(t,y)ydot
r = adda(t,y,p)=A(t,y)+p
14 JJ ª 目 錄 II
一階常微分方程式組–初值問題
例如以下指令呼叫impl,
由指令反解,可知輸出結果時刻是在 t = 0.4,而初值 y0 , y0 0 為
1 −0.04
y0 = 0 , y0 0 = 0.04
0 0
1 -3.0d7*y(2)*y(2)-s(2)
c r(3)= y(1) + y(2) + y(3) - 1.0d+0
c routines/default/Ex-impl.f 檔 return
c end
subroutine resid(neq, t, y, s, r, ires)
c ---------------------------------------- subroutine aplusp(neq, t, y, ml, mu, p, nrowp)
c 此函數計算 r=g(t,y)-a(t,y)*s c ----------------------------------------------
c inputs : t time c 此函數計算 p=p+a, 其中 a=a(t,y) 為一 ny x ny 矩陣
c y 在時間 t 之 y 值 double precision p, t, y
c s 在時間 t 之 dy/dt 值 dimension y(3), p(nrowp,3)
c ny y 之維度 (向量大小) p(1,1) = p(1,1) + 1.0d+0
c ires 可忽略 p(2,2) = p(2,2) + 1.0d+0
double precision r, s, t, y return
dimension y(3), s(3), r(3) end
r(1)= -.040d+0*y(1)+1.0d+4*y(2)*y(3)-s(1)
r(2)=.040d+0*y(1)-1.0d+4*y(2)*y(3)
15 JJ ª 目 錄 II
一階常微分方程式組–初值問題
−.04y1 + 104 y2 y3
g(t, y) = 0.04y1 − 104 y2 y3 − 3 × 107 y22
y1 + y2 + y3 − 1
1 0 0
A(t, y) = 0 1 0
0 0 0
實際上,第三個方程式是代數方程式而非微分方程式。
值得注意的是,函數 g(t, y) 的資訊並未出現在指令 impl 之參數中,而是透過 res 參數間接提供。
16 JJ ª 目 錄 II
一階常微分方程式組–初值問題
差分方程組
初值條件
y[k0 ] = y0
以 ode 求解差分方程組之呼叫格式為:
y=ode("discrete",y0,k0,kvect,f)
17 JJ ª 目 錄 II
一階常微分方程式組–初值問題
例如以下遞迴之差分方程式
差分方程組
初值條件
1
y(1) = 2
3
n=5;
function yp=a_function(k,y) // 差分方程式 // 計算出 [y(1),..y(5)]
yp=A*y+B*u(k);// u (控制項) 透過外部變數傳入 y=ode("discrete",y1,1,1:n,a_function);
endfunction y(:,2)-(A*y1+B*u(1)) // 比較 y(2)
y1= [1;2;3]; // 初值 // 計算出 [y3,y5,y7,y9]
A=diag([0.2,0.5,0.9]); B= [1;1;1]; y=ode("discrete",y1,1,3:2:9,a_function)
u=1:10; // 設定 u (控制項)
18 JJ ª 目 錄 II
常微分方程式–邊界值問題
3 常微分方程式–邊界值問題
內容
兩點式邊界值問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
特徵值問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
兩個以上解的邊界值問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
多點邊界值問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
邊界層問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
19 JJ ª 目 錄 II
常微分方程式–邊界值問題
微分方程組
dm1 u1
= f1 (x, z)
dxm1
m
d 2 u2
= f2 (x, z)
dxm2
..
.
dmn−1 un−1
= fn−1 (x, z)
dxmn−1
dmn un
= fn (x, z)
dxmn
1 −1 n −1 (x))T 為座標點 x 上 u 各分量u 最高階導數 m
其中z(x) = (u1 (x), u11 (x), · · · , um
1 (x), · · · , un (x) · · · , um
n i i
以下的各階導數 (包含 0 階)。 z(x) 之維度 (向量大小) 為 m = m1 + m2 + · · · + mn 。 ∗
邊界條件
g1 (ζ1 , z(ζ1 )) = 0
g2 (ζ2 , z(ζ2 )) = 0
..
.
gm∗ (ζm∗ , z(ζm∗ )) = 0
20 JJ ª 目 錄 II
常微分方程式–邊界值問題
呼叫 bvodeS 最簡單的形式為
Z=bvodeS(x,m,n,a,b,fsub,gsub,zeta)
由給定之兩點、多點邊界值微分方程組,可以整理出以下所須的輸出、入參數:
n 微分方程式數目或未知向量 u 之階數
a,b 左右邊界
x 實數向量,選定座標 a ≤ xi ≤ b 以輸出計算結果
m 整數向量代表微分方程式左邊之微分階數 m = [m1 , m2 , · · · , mn ], m∗ = m1 + m2 + · · · + mn
gsub 邊界條件傳回各邊界點上之邊界條件 gi , i = 1, · · · , m∗
21 JJ ª 目 錄 II
常微分方程式–邊界值問題
3.1 兩點式邊界值問題
以下列兩點式邊界值問題為例,
微分方程式
邊界條件
解題步驟如下:
1. 先由微分方程式左邊之階數,訂出階數向量 m=[4,1] , m∗ = 4 + 1 = 5
3. 用擴增未知向量 z,改寫微分方程式為
4. 由邊界條件滿足的位置,確定 zeta=[1 1 2 2 2]
22 JJ ª 目 錄 II
常微分方程式–邊界值問題
5. 用擴增未知向量 z,改寫邊界條件為
z1 (1) = 0 z3 (1) = 0
y2 (2) − 1 = 0 z4 (2) = 0 z5 (2) − 2 = 0
z=zeros(5,1);z(5)=1;
// 微分方程組 lhS= [0;1];
function RhS=fsub(x,z) endfunction
RhS= [(1-6*x*x*z(4)-6*x*z(3))/(z(5)^3);1] n=2; // 方程式數目
endfunction m= [4 1];// 微分階數
// 邊界條件 (傳回純量而非向量) N=100; //格點
function g=gsub(i,z) a=1; b=2; // 左右邊界
g= [z(1) z(3) z(1)-1 z(3) z(5)-2] zeta= [a a b b b]; // 邊界條件之位置
g=g(i) x=linspace(a,b,N); //產生均勻格點
endfunction ltol=4; // 改變內定誤差收斂條件.
// Z 之初始猜值 tol=1e-12;
function [z,lhS]=ystart(x) Z=bvodeS(x,m,n,a,b,fsub,gsub,zeta,ltol=ltol,tol=tol,ystart=ystart);
23 JJ ª 目 錄 II
常微分方程式–邊界值問題
3.2 特徵值問題
考慮以下之特徵值問題:
微分方程式
y 00 (x) = −λy(x)
邊界條件
y(0) = y 0 (0)
y(1) = 0
微分方程式
y 00 (x) = −λy(x)
λ0 = 0
微分方程式
24 JJ ª 目 錄 II
常微分方程式–邊界值問題
y
0
將 x ∈ [0, 1] 各點欲解之值整理成向量 z = y 後,再重寫方程式成為 bovdeS 所接受之格式:
λ
微分方程式
y 00 (x) = −z3 z1
λ0 = 0
邊界條件
z= [1;0;la0]
function rhs=fsub(x,z) // 微分方程式右邊項 lhs= [0;0]
rhs= [-z(3)*z(1);0] endfunction
endfunction a=0;b=1;
function g=gsub(i,z) // 邊界條件共三項 m= [2;1];
g= [z(1)-z(2) z(1)-1 z(1)] n=2;
g=g(i) zeta= [a a b]; // 邊界條件的位置
endfunction N=101;
// 初始猜值函數 x=linspace(a,b,N)';// 輸出結果之位置
function [z,lhs]=ystart(x,z,la0)
25 JJ ª 目 錄 II
常微分方程式–邊界值問題
26 JJ ª 目 錄 II
常微分方程式–邊界值問題
3.3 兩個以上解的邊界值問題
微分方程式
y 00 (x) = −ey(x)
邊界條件
y(0) = 0
y(1) = 0
[ ]
y
這個邊界值問題多重解,這展示求解其中兩個解,將各點欲解之值整理成向量 z = 0 後,再重寫方程式成
y
為
微分方程式
27 JJ ª 目 錄 II
常微分方程式–邊界值問題
邊界條件
z1 (0) = 0
z1 (1) = 0
以下程序,找出為方程式的兩組解
28 JJ ª 目 錄 II
常微分方程式–邊界值問題
3.4 多點邊界值問題
微分方程式
y(x)
y 000 (x) = 1, z = y 0 (x)
y 00 (x)
邊界條件
y(−1) = z1 (−1) = 0
y(1) = z1 (1) = 2
y(0) = z1 (0) = 1
endfunction
a=-1;b=1;c=0; N=10; zeta= [a c b]; // 必須包含中間點
// c 點必須在 fixpnt 中 (bvodeS 選擇性參數之ㄧ). x=linspace(a,b,N);
n=1;m= [3]; // 微分方程式之階數 // fixpnt 除了兩邊以以外的所有點 (此例為 c)
function rhs=fsub(x,z) // 微分方程式右邊項 z=bvodeS(x,m,n,a,b,fsub,gsub,zeta,fixpnt=c);
rhs=1 function y=yex(x) // 正解
endfunction y=x.^3/6+x.^2-x./6+1
function g=gsub(i,z) endfunction
g= [z(1)-2 z(1)-1 z(1)-2] // 計算誤差量
g=g(i) disp(norm(yex(x)-z(1,:)),'norm(yex(x)-z(1,:))= ')
29 JJ ª 目 錄 II
常微分方程式–邊界值問題
3.5 邊界層問題
微分方程式
1
f 000 (η) = − f f 00
2
邊界條件
η=0: f = 0, f 0 = 0
η=∞: f0 = 1
f
將各點上之未知量表為 z = f 0 ,可以使用以下之指令求得
f 00
30 JJ ª 目 錄 II
常微分方程式–邊界值問題
微分方程式
z10 (η) = z2
z20 (η) = z3
1
z30 (η) = − z1 z3
2
邊界條件
η=0: z1 = 0, z2 = 0
η=∞: z2 = 1
利用 bvodeS 解以上之一皆微分方程組邊界問題之指令如下:
g=g(i)
function rhs=blas2(x,z) // 改用一皆微分方程祖 endfunction
rhs = [z(2) ; z(3) ; -0.5*z(1)*z(3)]
endfunction a=0; b=10;
n=3; // 三個方程式
function g=gsub(i,z) m=[1 1 1]; // 三個一階微分方程組
g= [z(1) z(2) z(2)-1] N=100;
31 JJ ª 目 錄 II
常微分方程式–邊界值問題
32 JJ ª 目 錄 II
微分–代數方程式
4 微分–代數方程式
內容
微分–代數方程式, 使用 dassl 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
跨零條件之微分–代數方程式, 使用 dasrt 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . 36
微分方程組最一般的表示法,是透過非線性代數式表現一階導數量和變量之關係,這類方程式稱為代
數–微分方程組。 Scilab 提供 dassl, dasrt 兩指令 (請參考 6.4 ) 求解此類方程組。
由於所有高階微分問題,都可以轉為一階微分高維度 (向量) 問題,因此 dassl,dasrt 指令之應用範圍相
當大。與一般初值問題不同之處在於,代數–微分問題之初始條件還必須包含導數量 ẏ(t0 ) = ẏ0 這是因為代
數–微分關係在初始時間 t0 時,y0 , ẏ0 之關係並不唯一。但使用者可以選擇輸入一大約之估計值,使求解過程
逐漸收斂到其中一組解。
33 JJ ª 目 錄 II
微分–代數方程式
微分-代數方程組及初值條件
g(t, y, ẏ) = 0
y(t0 ) = y0
ẏ(t0 ) = ẏ0
dassl 的呼叫格式如下,
[R]=dassl(x0,t0,t,res ) // 內定簡式
[R [,hd]]=dassl(x0,t0,t [,atol,[rtol]],res [,jac] [,info] [,hd]) // 一般式
[ ]
y0
其中第一個參數 x0 = 為初值 y0 , ẏ0 的合成向量。 res 代表代數–微分組 g(t, y, ẏ)。而傳回值之矩陣
ẏ0
R 的每一列為一依序為 t, y0 , ẏ0 之向量,也就是
t1 t2 · · · tk
R = y1 y2 · · · yk
ẏ1 ẏ2 · · · ẏk
其中 t = [t1 t2 · · · tk ] 為須要輸出計算結果的時刻。
例如下頁:
34 JJ ª 目 錄 II
微分–代數方程式
微分–代數方程組 :
−0.04y1 + 104 y2 ∗ y3 − ẏ1 = 0
0.04y1 − 104 y2 ∗ y3 − 3 × 107 y22 − ẏ2 = 0
y1 + y2 + y3 − 1 = 0
初值條件
1 −0.04
y0 = 0 , ẏ0 = 0.04
0 0
y0= [1;0;0];
yd0= [-0.04;0.04;0];
deff('[r,ires]=chemres(t,y,yd)',[ t= [1.d-5:0.02:.4,0.41:.1:4,40,400,4000,...
'r(1)=-0.04*y(1)+1d4*y(2)*y(3)-yd(1);'; 40000,4d5,4d6,4d7,4d8,4d9,4d10];
'r(2)=0.04*y(1)-1d4*y(2)*y(3)-3d7*y(2)*y(2)-yd(2);' // 1. 使用內定方法
'r(3)=y(1)+y(2)+y(3)-1;' Y=dassl([y0,yd0],0,t,chemres);
'ires=0']); info=list([],0,[],[],[],0,0);
deff('[pd]=chemjac(x,y,yd,cj)',[ // Jacobian 梯度函數 info(2)=1; // 輸出中間計算結果
'pd= [-0.04-cj , 1d4*y(3) , 1d4*y(2);'; // 未使用 Jacobian
'0.04 ,-1d4*y(3)-2*3d7*y(2)-cj ,-1d4*y(2);'; Y=dassl([y0,yd0],0,4d10,chemres,info);
'1 , 1 , 1 ]']) // 使用 Jacobian 梯度向量函數
Y=dassl([y0,yd0],0,4d10,chemres,chemjac,info);
35 JJ ª 目 錄 II
微分–代數方程式
微分-代數方程組及初值條件
g(t, y, ẏ) = 0
y(t0 ) = y0
ẏ(t0 ) = ẏ0
跨零條件
S(t, y) = 0
36 JJ ª 目 錄 II
微分–代數方程式
微分–代數方程組 :
dy
= ((2 log(y) + 8)/t − 5)y, 1 ≤ t ≤ 6
dt
跨零條件
// 提供跨零條件
y0=1;t=2:6;t0=1;y0d=3; deff('[rts]=gr1(t,y)','rts= [((2*log(y)+8)/t-5)*y;log(y)-2.2491]')
atol=1.d-6;rtol=0;ng=2; // 求解
[yy,nn]=dasrt([y0,y0d],t0,t,atol,rtol,res1,ng,gr1);
// 提供代數--微分關係式 //(應傳回 nn= [2.4698972 2] = [結束時刻 跨零條件編號])
deff('[delta,ires]=res1(t,y,ydot)','ires=0;delta=ydot-((2*log(y)+8)/t-5)*y')
37 JJ ª 目 錄 II
線性微分及差分方程組模擬簡介
5 線性微分及差分方程組模擬簡介
38 JJ ª 目 錄 II
線性微分及差分方程組模擬簡介
5.1 線性微分系統之時間響應
指令 csim 針對線性連續系統進行模擬,這個指令能用狀態空間或轉換函數表示離散系統,如
連續系統之狀態空間表示法
連續系統之轉換函數表示法
y = H(s)u
plot2d([t',t'],[(csim('step',t,tf2ss(s)*w))',0*t'])
// csim 線性微分系統之時間響應範例 //繪出以 step 函數輸入 w 系統之時間響應
// xbasc(3);xset("window",3);xselect();
// 代表多項式 s () plot2d([t',t'],[(csim('step',t,w))',0*t'])
s=poly(0,'s'); //繪出以 impulse 函數輸入 w/s 系統之時間響應
// 隨機產生一個 1 個輸入, 1 個輸出 xbasc(4);xset("window",4);xselect();
// 及 3 個內部狀態的動態系統 w plot2d([t',t'],[(csim('impulse',t,tf2ss(1/s)*w))',0*t'])
rand('seed',0);w=ssrand(1,1,3); //輸入改成時間函數 u(t) =|sin(t)|
w('A')=w('A')-2*eye(); // 確保隨機系統為穩定 function u=input(t)
t=0:0.05:5; u=abs(sin(t))
// 繪出以 step 函數輸入 s w 系統之時間響應 endfunction
xbasc(0);xset("window",0);xselect(); xbasc();plot2d([t',t'],[(csim(input,t,w))',0*t'])
39 JJ ª 目 錄 II
線性微分及差分方程組模擬簡介
5.2 線性差分系統之時間響應
指令 flts 針對線性離散系統進行模擬,這個指令能用狀態空間或轉換函數表示離散系統,如
離散系統之狀態空間表示法
離散系統之轉換函數表示法
y = H(z)u
rs=flts(u,Sys); // 使用狀態空間模擬
// 給 A,B,C, D 定義系統 (狀態空間法) norm(rh-rs,1) // 兩者應一樣
A= [1 2 3;0 2 4;0 0 1];B= [1 0;0 0;0 1];C=eye(3,3); //接力計算, 使用狀態空間
D= [-3 8;4 -0.5;2.2 0.9]; [ys1,x]=flts(u(:,1:4),Sys);ys2=flts(u(:,5:10),Sys,x);
Sys=syslin('d',A,B,C,D); norm([ys1,ys2]-rs,1) // 兩者應一樣
H=ss2tf(Sys); // H 為轉換函數 //接力計算, 使用轉換函數
u= [1;-1]*(1:10); // u 為控制輸入項 yh1=flts(u(:,1:4),H);yh2=flts(u(:,5:10),H,[u(:,2:4); yh1(:,2:4)]);
rh=flts(u,H); // 使用轉換函數模擬 norm([yh1,yh2]-rh) // 兩者應一樣
40 JJ ª 目 錄 II
Scialb 指令說明
6 Scialb 指令說明
內容
ode-常微分方程組求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
impl-微分-代數方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
bvodeS-bvode 的簡化呼叫版 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
dassl,dasrl -微分-代數方程式 (differential algebraic equation) . . . . . . . . . . . . . . . . . 57
external- Scilab 物件, 外部函數或程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
41 JJ ª 目 錄 II
Scialb 指令說明
6.1 ode-常微分方程組求解
常微分方程組求解
呼叫方法
• y=ode(y0,t0,t,f) :最簡呼叫型式
• y=ode("discrete",y0,k0,kvect,f) :離散問題型式
參數
y0 實數向量或矩陣 (初始條件)
t0 實數純量 (初始時間)
t 實數向量 (欲求得解的各個時間點)
f 外部函數 (函數、字串串列 (list))
type 以下字串之一: "adams""stiff""rk""rkf""fix""discrete""roots"
rtol,atol 與 y 相同大小的實數或實數向量
jac 外部函數 (函數、字串串列 (list))
w,iw 實數向量
k0 整數 (初始時間). kvect :整數向量 (僅用於 type="discrete" 狀
況)
42 JJ ª 目 錄 II
Scialb 指令說明
參數 (用於 type="discrete")
k0 整數,代表離散初始時間編號
kvect 整數向量, 指定離散時間以輸出模擬結果
dy
= f (t, y)
dt
y(t0 ) = y0
43 JJ ª 目 錄 II
Scialb 指令說明
ode 最簡單的呼叫方式為:
y=ode(y0,t0,t,f)
44 JJ ª 目 錄 II
Scialb 指令說明
dy
= f (t, y)
dt
f 為一外部函數, 可以利用 Scilab , Fortran 或 C 語言定義 (請參考 6.5)。
外部函數語法
1. 若 f 為一 Scilab 函數它的語法為:
ydot = f(t,y)
ode(y0,t0,t,'fex')
• Fortran 函式之語法為:
fex(n,t,y,ydot)
• C 函式之語法為:
fex(int *n,double *t,double *y,double *ydot)
45 JJ ª 目 錄 II
Scialb 指令說明
1. Scilab 函數原型為
J=jac(t,y)
2. Fortran , C 函數原型為:
! Fortran 函數原型
subroutine fex(n,t,y,ml,mu,J,nrpd)
integer n,ml,mu,nrpd
double precision t,y(*),J(*)
// C 函數原型
void fex(int *n,double *t,double *y,int *ml,int *mu,double *J,int *nrpd,)
46 JJ ª 目 錄 II
Scialb 指令說明
1. Scilab 原型
z=g(t,y)
2. C 或 Fortran 原型
g(n,t,y,ng,gout)
47 JJ ª 目 錄 II
Scialb 指令說明
6.2 impl-微分-代數方程式
微分-代數方程式
呼叫方法
參數
r = res(t,y,ydot)
48 JJ ª 目 錄 II
Scialb 指令說明
r = adda(t,y,p)
49 JJ ª 目 錄 II
Scialb 指令說明
j = jac(t,y,ydot)
• 若 jac 為 一 字 串, 為 一 字 串, 它 代 表 一 Fortran 或 C 副 程 式 的 名 稱 , 請 參 考
routines/default/Ex-impl.f 檔案。
說明 求解隱式微分方程式
範例
50 JJ ª 目 錄 II
Scialb 指令說明
51 JJ ª 目 錄 II
Scialb 指令說明
bvode 的簡化呼叫版
呼叫方法
z=bvodeS(x,m,n,a,b,fsub,gsub,zeta, ...
[ystart,dfsub,dgsub,fixpnt,ndimf,ndimi,ltol,tol,ntol,nonlin, collpnt,subint,iprint,ireg,ifail])
參數
52 JJ ª 目 錄 II
Scialb 指令說明
代表未知向量 u 各分量之各階微分值。
gsub 提供計算側邊條件的計算函數名稱,可以使用 外部函數 (6.5)。 gsub 為以下側邊條件的函
數名稱
gj (ζj , z(u(ζj ))) = 0, j = 1, · · · , m∗
m∗ = m1 + m2 + · · · + mN
函數形式為 [g]=gsub (i , z) 其中 1 < i < m∗ , 此函數只傳回第 i 行側邊條件 (純量)
gj (ζj , z(u(ζj )))
zeta zeta(j) ( ζj ) 代表第 j 個側邊條件 (side condition) 的座標,必須滿足 ζj ≤ ζj+1 。 zeta 各點
∑
必須同時為 fixpnt 向量內一值 (如果使用 fixpnt )。 zeta(j) ( ζj ) 的長度為 m∗ = mi 。
53 JJ ª 目 錄 II
Scialb 指令說明
∑
z 所有各分量 ui 之解以及 mi 以下之微分量所成的向量 (參考範例)。 z 的長度為 m∗ = mi
。
1 −1 mN −1
z(u(x)) = (u1 (x), u11 (x), · · · , um
1 (x), · · · , uN (x))T
= (z1 , · · · , zm∗ )T , m∗ = m1 + m2 + · · · + mN
選擇性輸入參數
∗
為 m 的向量, dmval 是維度為 N 的向量。
dfsub f (x, z(u(x))) 之 Jacobian 梯度函數名稱, Scilab 之函數原型為 [df]=dfsub (x, z)
∂fi
df (i, j) = ∂zj , i = 1, · · · , N
j = 1, · · · , m∗
dg(j) = ∂gi
∂zj , i = 1, · · · , m∗
j = 1, · · · , m∗
54 JJ ª 目 錄 II
Scialb 指令說明
其中 v(x) 為近似解。
ntol 計算容忍精度所參考的分量解及其微分值數目,其中 0 ≤ ntot ≤ m∗ ,請參考 ltol , tol 兩
參數之設定。
nonlin 0 :線性問題, 1 :非線性問題
collpnt 每一次區間 (subinterval) 內所使用的計算點 ( collocation points) 數其中 max mi ≤ k ≤ 7 (內
部計算時在輸入的格點間先分割出 subint 個次區間,每一次區間內,分佈計算點以提高
計算精度)。如果collpnt=0 則設定 collpnt = maxi (max mi + 1, 5 − max mi )
subint 網格間之次區間數目。如果 subint = 0 則代表內定值 subint = 5 。
55 JJ ª 目 錄 II
Scialb 指令說明
• = 0 部分列印
• = 1 不列印
ireg
• = 0 正規 (regular) 問題
56 JJ ª 目 錄 II
Scialb 指令說明
呼叫方法
參數
t0 實數,初始時間。
t 實數純量或行向量,為希望計算出解的時間。如果希望在 dassl 的每一計算過程皆輸出果
時,可以設定輸入參數 info(2)=1 。
atol,rtol 實數純量或和 y 大小一樣的列向量。. atol,rtol 分別提供的絕對及相對誤差容忍精度。若
為向量,代表 y 各分量的容忍精度。
57 JJ ª 目 錄 II
Scialb 指令說明
list(res,x1,x2,...)
其中 res 的函數原型變為
r=res(t,y,ydot,x1,x2,...)
58 JJ ª 目 錄 II
Scialb 指令說明
dg
jac 外部函數 (函數、字串串列 (list)) 。給一實數 c , 計算 dy + c ddgẏ 數值之函數。
• 串列 (list) :若為串列,格式為
list(jac,x1,x2,...)
jac 的函數原型成為
r=jac(t,y,ydot,x1,x2,...)
59 JJ ª 目 錄 II
Scialb 指令說明
60 JJ ª 目 錄 II
Scialb 指令說明
參數 (僅用於指令 dasrt)
list(surf,x1,x2,...)
此時 surf 之函數原型為
r=surf(t,y,x1,x2,...)
dassl 說明
61 JJ ª 目 錄 II
Scialb 指令說明
微分-代數方程式
g(t, y, ẏ) = 0
初值條件
y(t0 ) = y0
ẏ(t0 ) = ẏ0
dasrl 說明
微分-代數方程式
g(t, y, ẏ) = 0
初值條件
y(t0 ) = y0
ẏ(t0 ) = ẏ0
跨零條件
S(t, y) = 0
62 JJ ª 目 錄 II
Scialb 指令說明
只要一個以上的跨零函數為 0 時,即停止計算。程式同時輸出產生跨零條件的時間,及滿足跨零條件的區面
編號。
詳細的範例可參考 SCIDIR/tests/dassldasrt.tst
63 JJ ª 目 錄 II
Scialb 指令說明
[f,g,ind]=costfunc(x,ind)
optim(costfunc,...)
在這裡, costfunc ( optim 所需要的代價函數) 計算函數 f (x) 及函數梯度 g = ∇f (x) 在 x 上之值。 (ind 為
一整數,在 optim 內有其定義)
如果外部函數內需要額外變動之參數以執行時,這些參數可以透過全域變數的方式影響外部函數。
[f,g,ind]=costfunc(x,ind,a,b,c)
64 JJ ª 目 錄 II
Scialb 指令說明
optim(list(costfunc,a1,b1,c1),....
65 JJ ª 目 錄 II
後記
7 後記
有關本文內容之錯、別、漏字及其他內容相關之指正、建議或學習問題請於
66 JJ ª 目 錄 II