Re: [問題] 請問解ODE使用if 已回收
簡單來說我就是有三條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
05/20 23:48, 2F
→
05/20 23:49, , 3F
05/20 23:49, 3F
→
05/20 23:51, , 4F
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
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
05/21 00:42, 12F
→
05/21 00:42, , 13F
05/21 00:42, 13F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):