[問題] 請教 解ODE聯立方程式已回收

看板MATLAB作者 (vog)時間16年前 (2009/08/14 11:48), 編輯推噓3(306)
留言9則, 2人參與, 最新討論串1/1
============================[前言]========================================== 首先我先令4個狀態變數:x1 x2 x3 x4 我要解的方程式如下: d(x1) --------= x2 dt d(x2) --------= F1+G1*T dt d(x3) --------= x4 dt d(x4) --------= F2+G2*T dt 其中 (a2+a6)*sin(x1) + a4*cos(x1) + (a3+a5)*sin(x1)*cos(x1)*x2^2 F1= --------------------------------------------------------------- (a11+a13)*cos(x1)*cos(x1) +a12 1 G1= ----------------------------------- (a11+a13)*cos(x1)*cos(x1) +a12 F2= a10 + a8*sin(x1)*x2^2 + a9*F1*cos(x1) G2= a9*G1*cos(x1)*T 這裡面的 a11 a12 a13 a2 a3 a4 a5 a6 a7 a8 a9 都是固定不變的常數 [-α - (λ1*x2+F1)*sign(s1) - λ2*(λ3*x4+F2)*sign(s2)] T = ------------------------------------------------------------------ G1*sign(s1) + λ2*G2*sign(s2) s1 = x2 + λ1*x1 s2 = x4 + λ3*x3 這裡面的 αλ1 λ2 λ3 都是固定不變的常數 sign 是判斷括弧內東西是正數還是負數,如果括弧內是正數 sign()= 1 如果括弧內是負數 sign()=-1 ============================[問題]=========================================== 我想問為什麼程式只能跑到時間等於3? 如果想要把時間軸拉長過3秒,就會出現 Memory 的錯誤訊息 我之前的想法是:我的資料量太大所以 Memory 負荷不了,才會出現錯誤 我之前的解決方法:改用 ode23t 較不精準的解法。 使用 ode23t 是可以把時間拉到13秒,但x1值卻變成發散。 請問版上各位有沒有辦法可以解決, 把秒數拉長卻不會出現錯誤信息,也不會造成數值發散的方法 謝謝 ==================================[CODE]================================= [t,x] = ode45(@pp,[0 0.7],[0.1,0,0,0]); function dx = pp(t,x) dx = zeros(4,1); M=5; % 下質量塊重 M2=20; % 車輪重 m=2; % 上質量塊重 m1=1; % 桿 a=0.1; % 桿上半部長 b=0.02; % 桿下半部長 r=0.04; % 車輪半徑 l=0.12; % 桿總長 %% 其他參數 g=9.8; % 重力加速度 N=(M+M+m+m1)*g; % 整個系統正向力 kf=0.85; % 車輪與地面摩擦係數 % 自訂參數 landa1=0.9; % λ = 1 landa2=0.8; landa3=5; alfa=10; % 滑動參數 S s1=x(2)+landa1*x(1); s2=x(4)+landa3*x(3); %系統參數 a11=(M*b+m*a)*(M*b-m*a)/(-M-M2-m-m1); a12=-1/3*m*l*l-m*b*b; a13=(M*b*b-m*a*a); a2= M*g*b; a3= ((M*b+m*a)*(M*b-m*a)/(-M-M2-m-m1); a4= (M*b+m*a)*(-kf*N)/(-M-M2-m-m1); a5= -(M*b*b+m*a*a); a6= -(m*a+m1*(l/2-b))*g; a8=-(-M*b+m*a)/((-M-M2-m-m1)*r); a9=-(M*b-m*a)/((-M-M2-m-m1)*r); a10=(-kf*N)/((-M-M2-m-m1)*r); F1= (a4*cos(x1)+(a2+a6)*sin(x1)+(a3+a5)*sin(x1)*cos(x1)*x2^2)... /((a11+a13)*cos(x1)*cos(x1)+a12); G1= 1/((a11+a13)*cos(x1)*cos(x1)+a12); F2= a10+a8*sin(x1)*x2^2+a9*F1*cos(x1); G2= a9*G1*cos(x1)*T; %% Input T T = (-alfa-(landa1*x(2)+F1)*sign(s1)-landa2*(landa3*x(4)+F2)*sign(s2) )... /(G1*sign(s1) + landa2*G2*sign(s2)); %% STATE EQUATION dx(1,1)=x(2); dx(2,1)=F1+G1*T; dx(3,1)=x(4); dx(4,1)=F2+G2*T; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.59.152

08/15 12:06, , 1F
你F方程式中的X1 = X(1)??
08/15 12:06, 1F

08/15 12:13, , 2F
好奇問一下,你的程式真的能跑 = =?
08/15 12:13, 2F

08/15 12:14, , 3F
你的G2和T怎麼算的?不用起始化?
08/15 12:14, 3F

08/17 09:56, , 4F
恩恩 F方程式中的X1 = X(1),我只可以跑到3秒
08/17 09:56, 4F

08/17 09:57, , 5F
G2和T是自己推導出來的。 起始化? 指的是初始值嗎?
08/17 09:57, 5F

08/17 11:01, , 6F
對,沒有初始值,你的pp function不能執行。
08/17 11:01, 6F

08/17 11:02, , 7F
或是你的程式EMAIL給我,我幫你試試看也可
08/17 11:02, 7F

08/17 11:02, , 8F
takuya@wavenet.cycu.edu.tw
08/17 11:02, 8F

08/17 17:36, , 9F
程式我收到了,我也將原是程式修正回寄給你了。
08/17 17:36, 9F
文章代碼(AID): #1AXDv_eU (MATLAB)
文章代碼(AID): #1AXDv_eU (MATLAB)