您好,我被要求为中点规则创建一个matlab代码。我所拥有的是eulers方法的代码,因此我必须进行一些修改,但是我正在努力做到以下几点
function H = heun(f,a,b,ya,M)
h = (b-a)/M;
T = zeros(1,M+1);
Y = zeros(1,M+1);
T = a:h:b;
Y(1) = ya;
for j = 1 : M
k1=feval(f,T(j),Y(j));
k2=feval(f,T(j+1),Y(j)+h*k1);
Y(j+1)=Y(j)+(h/2)*(k1+k2);
end
H = [T' Y'];
function f = dif1(t,y)
f=(t-y)/2;
是的,我的函数是y'=(t-y)/ 2以及间隔和其他在命令窗口中定义的内容。
如果有可能使for循环成为中点规则,那么我认为这是一条可行之路,我们将不胜感激。
答案 0 :(得分:0)
下面是我在MATLAB中实现的欧拉方法,用于解决一对耦合的一阶DE。它解决了以下表示的谐波振荡器:
y1(t + h)= y1(t)+ h * y2(t)
y2(t + h)= y2(t)+ h *(-A / M y1(t)-B / M y1(t)/ | y1(t)|)
% Do the integration using the Euler Method
while(T<=T1)
% Update the position of the pt mass using current velocity
Y1(i+1) = Y1(i) + H*Y2(i);
% Update the velocity of the pt mass checking if we are turning
% within the C/A band
if ( (abs(Y2(i) < th) && abs(Y1(i)) < C/A) )
Y2(i+1) = Y2(i);
else
Y2(i+1) = Y2(i) + H * ( ((-A/M)*Y1(i)) - (B/M)*sign(Y2(i)) );
end
% Incriment the time by H
T = T + H;
% Increase the looping index variable
i = i + 1;
end
在没有明确解决您的家庭作业问题的情况下,希望此示例对您有所帮助。需要注意的几件事:在这个特定的示例中,if语句说明了静摩擦-因此,请忽略它,而仅查看“ else”之后发生的情况。
还要注意,我将初始条件y1(0)和y2(0)定义为Y1(i = 1)和Y2(i = 1),因此从Yj(i + 1)开始给出Yj(2)。注意,T1是模拟的结束时间。
以下是使用改进的Euler方法的相同问题。如果导出此系统的更新方程式,则应该能够遍历代码。
% Do the integration using the Improved Euler Method
% Ki_j = K^i_j
while(T<=T1)
% Calculate K^i_j's
K1_1 = Y2(i);
% Must check if we are turning within C/A
if ( (abs(Y2(i) < th) && abs(Y1(i)) < C/A) )
K1_2 = 0;
else
K1_2 = (-A/M)*Y1(i) - (B/M)*sign(Y2(i));
end
K2_1 = Y2(i)+H*K1_2;
% Checking if we are turning within C/A
if ( (abs(Y2(i) < th) && abs(Y1(i)) < C/A) )
K2_2 = 0;
else
K2_2 = (-A/M)*(Y1(i) + H*K1_1) - (B/M)*sign(Y2(i)+ H*K1_2);
end
% Update the position and velocity
Y1(i+1) = Y1(i)+ (H/2)*(K1_1+K2_1);
Y2(i+1) = Y2(i) + (H/2)*(K1_2+K2_2);
% Incriment the time by H
T = T + H;
% Increase the looping index variable
i = i + 1;
end