Re: [問題] 請問解ODE使用if 已回收

看板MATLAB作者 (貓與鋼琴)時間14年前 (2010/05/20 23:47), 編輯推噓0(0013)
留言13則, 2人參與, 最新討論串2/3 (看更多)
簡單來說我就是有三條ODE 第二條與第三條ODE只差在係數不同 我用第一條跟第二條ODE解聯立(t=0,t=0.0001) t=0.0002開始之後就進入條件判斷 做 第一條與第二條聯立 , 還有第一條與第三條聯立的切換 以下是我寫的 主 副程式,因為參數很多,所以可以跳過參數定義 主要是在 我多令一組未知參數矩陣 B C P G 當作我要切換的已知參數 B1 C1 P1 G1 B2 C2 P2 G2 流程與我上一篇敘述的差不多,只是我真正使用的方程式很長 副程式是我已經加入的切換條件 if t<0.1 V=sin(10*pi*t) : : else V=0 : : end 副程式的這個是在定義我的V作用的時間點,與我要切換係數是沒有關連 加入切換條件的程式就是那堆冒號 =================================================================== %解ODE副程式 function dy=test2(t,y) global M K f11 e31 B33 sp h31 Q7m z1 z2 B1 C1 P1 G1 B2 C2 P2 G2 R1 L1 Q5k B C P G cp td te A if t<0.1 V=sin(10*pi*t) if t<=0.0001 B=B1; C=C1; P=P1; G=G1; elseif t>0.0001 && (-h31/sp).*(Q5k.*z1)*[y(1,1);y(2,1);y(3,1);y(4,1) ;y(5,1);y(6,1)]... -R1*y(17,1)-L1*y(21,1)-cp*y(13,1) > 0 t=t-td:td:t B=B2; C=C2; P=P2; G=G2; elseif t>0.0001 && (-h31/sp).*(Q5k.*z1)*[y(1,1);y(2,1);y(3,1);y(4,1) ;y(5,1);y(6,1)]... -R1*y(17,1)-L1*y(21,1)-cp*y(13,1) <= 0 B=B1; C=C1; P=P1; G=G1; end else V=0 if t>0.0001 && (-h31/sp).*(Q5k.*z1)*[y(1,1);y(2,1);y(3,1);y(4,1) ;y(5,1);y(6,1)]... -R1*y(17,1)-L1*y(21,1)-cp*y(13,1) > 0 t=t-td:td:t B=B2; C=C2; P=P2; G=G2; elseif t>0.0001 && (-h31/sp).*(Q5k.*z1)*[y(1,1);y(2,1);y(3,1);y(4,1) ;y(5,1);y(6,1)]... -R1*y(17,1)-L1*y(21,1)-cp*y(13,1) <= 0 B=B1; C=C1; P=P1; G=G1; end end dy=[y(7:12,1) ;inv(M)*f11*V-inv(M)*K*y(1:6,1)... -inv(M)*(A.*Q7m).*(z1.*y(13,1)+z2.*y(15,1)) ;y(17:20,1) ;y(21:24,1) ;-2.*B*y(21:24,1)-C*y(17:20,1)-(h31/sp).*P*G*y(7:12,1)] ======================================================================= %解ODE主程式 clear all ; clc ; global M K f11 e31 B33 sp h31 Q7m B1 C1 P1 G1 yinit z1 z2 cp B2 C2 P2 G2 ts te td R1 L1 Q5k B C P G A load('C:\Program Files\MATLAB\R2007a\work\data1.mat) % 讀取參數 %定義參數 wa1=2*pi*144.5*0.98; wa2=wa1 ; zeta1=0.0035 ; zeta2=zeta1 ; L11=1/(wa1^2*cp); L22=1/(wa2^2*cp) ; R1=2*L11*zeta1*wa1 R2=R1; R3=R1; R4=R1; L1=L11/2; L2=L1; L3=L1; L4=L1; L12=L3+L4 : wb1=(1/(L1*cp))^0.5 : wb2=(1/(L3*cp))^0.5 : zetab11=(R1+R2)/(2*L1*wb1) : zetab12=(-R2)/(2*L1*wb1) : zetab21=(-R2)/(2*L2*wb1) : zetab22=-zetab21 : zetab33=(R3+R4)/(2*L3*wb2) : zetab34=(-R4)/(2*L3*wb2) : zetab43=(-R4)/(2*L4*wb2) : zetab44=-zetab43 : Q5k=f12 ; A=e31*B33/sp : %定義壓電方程式係數矩陣 %diode off B1=[zeta1*wa1,0,0,0;0,0,0,0;0,0,zeta2*wa2,0;0,0,0,0]; %壓電二階微分係數矩陣 C1=[wa1^2,0,0,0;0,0,0,0;0,0,wa2^2,0;0,0,0,0]; %壓電一階微分項係數矩陣 P1=[1/L11,0,0,0;0,0,0,0;0,0,1/L22,0;0,0,0,0]; G1=[Q5k.*z1;0,0,0,0,0,0;Q5k.*z2;0,0,0,0,0,0]; %Q5k為1*6矩陣 %diode on B2=[zetab11*wb1,zetab12*wb1,0,0 %壓電二階微分係數矩陣 ;zetab21*wb1,zetab22*wb1,0,0 ;0,0,zetab33*wb2,zetab34*wb2 ;0,0,zetab43*wb2,zetab44*wb2]; C2=[wb1^2,0,0,0;0,0,0,0;0,0,wb2^2,0;0,0,0,0]; %壓電一階微分項係數矩 P2=[1/L1,0,0,0;0,0,0,0;1/L3,0,0,0;0,0,0,0]; G2=[Q5k.*z1;0,0,0,0,0,0;Q5k.*z2;0,0,0,0,0,0]; %開始解樑與壓電耦合之ODE ts=0; %起始時間 td=0.0001 ; %時間間隔 te=9; %終止時間 t=ts:td:te yinit=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] options=odeset('RelTol',1e-10) [t,y]=ode23tb('test2',t,yinit,options) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.13.191

05/20 23:47, , 1F
其實我是怕大家看不懂我的問題
05/20 23:47, 1F

05/20 23:48, , 2F
一般解ODE比較沒問題
05/20 23:48, 2F

05/20 23:49, , 3F
但是該如何寫 每解一個時間點就先停住
05/20 23:49, 3F

05/20 23:51, , 4F
然後判斷條件yes=>繼續 no=>變更ODE係數在解
05/20 23:51, 4F

05/20 23:51, , 5F
每個時間間隔做一次這樣的動作到結束
05/20 23:51, 5F
※ 編輯: inoran54787 來自: 122.116.13.191 (05/20 23:55)

05/20 23:56, , 6F
第一次寫這種流程讓我很頭痛@@
05/20 23:56, 6F

05/20 23:57, , 7F
我是怕切換會破壞物理特性 或是導致切換算出來的答案
05/20 23:57, 7F

05/20 23:57, , 8F
不對
05/20 23:57, 8F
※ 編輯: inoran54787 來自: 122.116.13.191 (05/21 00:05)

05/21 00:17, , 9F
其實我的意思是說把原始有物理意義的問題 PO 上來啦 @@
05/21 00:17, 9F

05/21 00:19, , 10F
程式很長,不是相關領域的可能也不是很清楚在幹麼
05/21 00:19, 10F

05/21 00:19, , 11F
所以我才會問從物理的角度為什麼不能直接解?
05/21 00:19, 11F

05/21 00:42, , 12F
OK
05/21 00:42, 12F

05/21 00:42, , 13F
物理的角度可以,但是牽扯到程式計算就會有問題
05/21 00:42, 13F
文章代碼(AID): #1BzLbrLy (MATLAB)
文章代碼(AID): #1BzLbrLy (MATLAB)