在线时间 31 小时 最后登录 2017-7-6 注册时间 2014-7-7 听众数 12 收听数 0 能力 0 分 体力 316 点 威望 0 点 阅读权限 30 积分 150 相册 0 日志 0 记录 0 帖子 111 主题 3 精华 0 分享 0 好友 5
升级 25%
TA的每日心情 开心 2015-9-11 00:19
签到天数: 54 天
[LV.5]常住居民I
自我介绍 无,新手,最近才接触建模,求指点。
问题是这样的(见附图)8 x; C+ y" b, r$ _ N& [" T
K* O" W: T3 J O$ D
然后我的程序如下function Untitled+ ?1 Q: ^: H8 U
clear all;clc;
; ]! m2 u) ~4 m f=@(t)(2*sin(t)*(t<(4*pi)) + 0);
4 m% v [* x6 j2 q* M0 E- ^ g=@(t)(0+cos(t).*(t>=((7*pi)/2)));& S5 {! L( m- }, K- d
function dy = rigid(t,y)
2 P/ N2 B# K1 {) ]0 t dy = zeros(2,1);
; _6 i7 D% Z, ?) t1 q dy(1) = y(2)-f(t);) p7 T5 h: N$ G( D0 Z6 a# ~
dy(2) = y(1)*g(t)-y(2);! A5 J7 ^$ n/ K# B2 B
end; y5 q4 l% z\" v2 E
options = odeset('RelTol',1e-4,'AbsTol',[1e-5 1e-5]);
% T( Z( f) x7 m0 T) n, s %[T, y] = ode45(@rigid, [0 20], [1 2],options)
6 M. F\" H6 q. y, w1 O sol = ode45(@rigid, [0 20], [1 2],options);
* E# s* ]9 s( m; { x=linspace(0,20,200000);3 M2 A, o5 Q5 X\" N; J4 x1 }
y=deval(sol,x);4 d4 n+ k4 ~; N- F
res=y(1,:)+y(2,:);) R4 O# d+ B3 K5 f& q9 ~2 E& T
idx=find(abs(res-0)<1e-4) %相加,当和小于误差运行范围的时候可以认为它就为0
8 H# r& `8 N\" Y xx=x(idx) %算出在x中的下标) E4 L% X# Y+ N/ |, K4 T0 k
F=@(t)(f(t)+g(t));
( |* h\" P, c/ s! ~) A\" J6 E r=[]; %得出的解反代入方程求值,得到的值保存在r中。如果解正确,r中的值应该非常接近0
1 K Y V* b) M6 R7 G* l0 k7 Y for i=1:size(xx,2)
- ^9 A\" W& N\" b4 ~0 k' v r = [r F(xx(i))]; %将解的值依次带入。当前问题在于r中的值都和0差的很远- y6 _! a* g2 x0 B4 _
end2 A( S7 D; V) c4 @
r4 {1 x. x# W6 b$ Q* B, k: x9 L
end 复制代码 问题就是最后算出来的解再带入方程进行检验得出的结果和0差的好远,都到了1.73几。7 l) ^4 b6 H% ^. \6 D
我也不知道哪里用错了,但猜测可能是由于微分方程里出现了f(t),g(t)的缘故
M. l+ j/ k: d/ U1 a c! g, H4 }" h, M6 d5 m9 _! h
求教大家我的程序是哪里出现了问题,该如何改呢?
" e s% A. D9 N 谢谢
( k8 n% d8 j3 m/ b) U
0 W9 @2 M% K- n- b3 q- a, S - T0 _; v0 |& ]: h% b u* F' D I% Z6 E
zan