数学建模社区-数学中国
标题:
matlab求解微分方程结果不对
[打印本页]
作者:
yzh07137
时间:
2015-7-30 20:35
标题:
matlab求解微分方程结果不对
问题是这样的(见附图)
9 j) _8 r$ d4 C0 h" _, d
* E+ P8 w* m# b
然后我的程序如下
function Untitled
6 v' E( V5 z2 m' d9 L" ~
clear all;clc;
& ^/ j0 k2 n# C
f=@(t)(2*sin(t)*(t<(4*pi)) + 0);
5 D* U, d# ]6 \) y& Y, Y0 g
g=@(t)(0+cos(t).*(t>=((7*pi)/2)));
8 v: e) U* e; v# r9 {0 a
function dy = rigid(t,y)
$ `/ |) u: j# }% }$ k# Q/ c2 r
dy = zeros(2,1);
& j2 R0 v$ k" h s
dy(1) = y(2)-f(t);
" i. d4 Q$ K! z/ {! p5 q/ p
dy(2) = y(1)*g(t)-y(2);
: q g* `: g6 n R
end
* ]! r% j( o2 D- ?$ Q
options = odeset('RelTol',1e-4,'AbsTol',[1e-5 1e-5]);
2 X" |# R# B, E% l
%[T, y] = ode45(@rigid, [0 20], [1 2],options)
/ z M, @! W3 A% M/ B
sol = ode45(@rigid, [0 20], [1 2],options);
( }, U3 @( M% x6 g
x=linspace(0,20,200000);
, z' g* m! ], u5 x- _# j S
y=deval(sol,x);
$ A5 ?( H* \2 S; G
res=y(1,:)+y(2,:);
0 v8 }! Z, q$ l
idx=find(abs(res-0)<1e-4) %相加,当和小于误差运行范围的时候可以认为它就为0
# @% K/ Y- K/ S! Z
xx=x(idx) %算出在x中的下标
5 B0 E( e) ^/ k: e- B% g+ f, q* d
F=@(t)(f(t)+g(t));
) p, g$ v; p9 V1 N) N7 X9 i9 y) @
r=[]; %得出的解反代入方程求值,得到的值保存在r中。如果解正确,r中的值应该非常接近0
2 o) \* W, W! N1 j6 @
for i=1:size(xx,2)
?/ g0 w' O* S; `, O W E0 [
r = [r F(xx(i))]; %将解的值依次带入。当前问题在于r中的值都和0差的很远
1 ?$ Z+ v- z1 j5 H+ [2 e( a% i ]
end
) H& n% g: {' L9 S) W
r
9 Q6 T% X8 i" G9 r8 U J K
end
复制代码
问题就是最后算出来的解再带入方程进行检验得出的结果和0差的好远,都到了1.73几。
0 ~- P/ c7 p: B" {' m, ]7 v: }
我也不知道哪里用错了,但猜测可能是由于微分方程里出现了f(t),g(t)的缘故
/ ~1 k* W1 c- c _ C6 }
, F c$ F* L! @
求教大家我的程序是哪里出现了问题,该如何改呢?
8 G8 o9 @" A. U
谢谢
- y- n% W8 q# K: i5 O
0 |4 `7 a( t. t- o" `0 [/ M6 \# P
, t# d9 S) y! g
matlab.png
(12.23 KB, 下载次数: 547)
2015-7-30 20:35 上传
点击文件名下载附件
问题
作者:
yzh07137
时间:
2015-8-4 20:45
算了,就知道这种论坛一般也没人
+ G8 J3 s7 p* U* n; m7 p
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5