在Matlab中使用Euler方法

时间:2014-11-15 04:12:38

标签: matlab simulation microsoft-dynamics

第一次发布在这里。非常沮丧,现在正在为这个班级工作。

基本上,我们的想法是使用欧拉方法来模拟和绘制运动方程。运动方程是ODE的形式。

我的教授已经为稍微类似的系统设置了一些代码,并希望我们使用拉格朗日推导出运动方程。我相信我已经正确地导出了EOM,但是我在Matlab方面遇到了问题。

奇怪的是,在另一个单独的EOM上使用类似的技术,我没有任何问题。所以我不确定我做错了什么。

这里是正常工作的部分的代码:



close all; clear all; clc; 
% System parameters
w = 2*pi;
c = 0.02;
% Time vectors
dt = 1e-5;
t = 0:dt:4;
theta = zeros(size(t));
thetadot = zeros(size(t));

% Initial conditions
theta(1)=pi/2; %theta(0)
thetadot(1)=0; %thetadot(0)

for I = 1 : length(t)-1;
thetaddot = -c*thetadot(I)-w^2*sin(theta(I));
thetadot(I+1)=thetadot(I)+thetaddot*dt;
theta(I+1)=theta(I)+thetadot(I)*dt ;
end
figure(1);
plot(t,theta,'b');
xlabel('time(s)');
ylabel('theta');
title('Figure 1');
zoom on;
% Output the plot to a pdf file, and make it 6 inches by 4 inches
printFigureToPdf('fig1.pdf', [6,4],'in');
% Open the pdf for viewing
open fig1.pdf




一切运行正常,但Matlab抱怨printFigureToPdf命令。

现在,这是我遇到问题的代码。



close all; clear all; clc; clf
% System parameters
m=0.2;
g=9.81;
c=.2;
d=0.075;
L=0.001; %L is used for Gamma
B=0.001; %B is used for Beta
W=210*pi; %W is used for Omega

%Time vectors
dt = 1e-6; %Time Step
t=0:dt:10; %Range of times that simulation goes through
x=zeros(size(t));
xdot=zeros(size(t));

%Initialconditions
x(1)=0;%x(0)
xdot(1)=0; %xdot(0)

for I = 1 : length(t)-1;
xddot =-1/m*(c*xdot(I)-c*L*W*cos(W)+m*g-3*B*((d+x-L*W*sin(W*t)).^(-4)-(d-x-L*W*sin(W*t)).^(-4)));
xdot(I+1)=xdot(I)+xddot*dt;
x(I+1)=x(I)+xdot(I+1)*dt ;
end
figure(1);
plot(t,x,'b');
xlabel('time(s)');
ylabel('distance(m)');
title('Figure 2');
zoom on;
% Output the plot to a pdf file, and make it 6 inches by 4 inches
printFigureToPdf('fig1.pdf', [6,4],'in');
% Open the pdf for viewing
open fig1.pdf




使用此代码,我按照相同的步骤在第23行给出错误:"在赋值A(I)= B中,B和I中的元素数必须相同。&# 34;

就像我说的,我很困惑,因为其他代码工作正常,第二组代码给出了错误。

如果有人能帮我一把,我会非常感激。

提前致谢, 戴夫

编辑:根据建议,我将x(I + 1)= x(I)+ xdot(I + 1)* dt更改为x(I + 1)= x(I)+ xdot(I)* dt。但是,我仍然在第23行收到错误:"在作业A(I)= B中,B和I中的元素数必须相同。"

第23行是:xdot(I + 1)= xdot(I)+ xddot * dt;

所以,我尝试将其他行的建议调整为xdot(I + 1)= xdot(I)+ xddot(I)* dt;

进行此更改后,Matlab卡住了,我尝试让它运行几分钟但不会执行。我最终不得不关闭并重新打开该应用程序。

1 个答案:

答案 0 :(得分:0)

错误In an assignment A(I) = B, the number of elements in B and I must be the same.是您应该理解的,因为如果您不小心,它可能会在Matlab中频繁出现。

在您的情况下,您尝试将 1 元素值xdot(I+1)指定为包含多个元素xdot(I)+xddot*dt的内容。

实际上,如果您逐行浏览代码并观察工作区,您会注意到xddot不是预期的标量值,而是t大小的完整向量。这是因为在您定义xddot的前一行:

xddot =-1/m*(c*xdot(I)-c*L*W*cos(W)+m*g-3*B*((d+x-L*W*sin(W*t)).^(-4)-(d-x-L*W*sin(W*t)).^(-4)));

您仍然有许多引用x完整向量)和t完整向量)。您必须将所有这些对完整向量的引用替换为它们的一个索引,即使用x(I)t(I)。该行变为:

xddot =-1/m*(c*xdot(I)-c*L*W*cos(W)+m*g-3*B*((d+x(I)-L*W*sin(W*t(I))).^(-4)-(d-x(I)-L*W*sin(W*t(I))).^(-4)));

这样你的代码运行得很好。但是,它远未优化,运行速度相对较慢。我有一台功能强大的机器,它仍然需要很长时间才能运行。我建议你减少你的时间步骤,以便更合理,至少在你还在尝试你的代码时。如果你真的需要那种精确度,首先要确保你的代码运行正常,然后当它准备就绪时让它以完全精确的方式运行,并在你的计算机正在工作时去喝咖啡。

下面的代码段是代码的loop部分,其中包含xddot的正确分配。我还添加了一个简单的进度条,以便您可以看到代码正在执行某些操作。

hw = waitbar(0,'Please wait...') ;
npt = length(t)-1 ;
for I = 1 : npt
    xddot =-1/m*(c*xdot(I)-c*L*W*cos(W)+m*g-3*B*((d+x(I)-L*W*sin(W*t(I))).^(-4)-(d-x(I)-L*W*sin(W*t(I))).^(-4)));

    xdot(I+1) = xdot(I)+xddot*dt;
    x(I+1)    = x(I)+xdot(I+1)*dt ;

    pcdone = I / npt ;
    waitbar(pcdone,hw,[num2str(pcdone*100,'%5.2f') '% done'])
end
close(hw)

我强烈建议您将时间缩短到dt = 1e-3;,直到您对其他所有内容感到满意为止。

在最终版本中,您可以删除或评论对waitbar的调用,因为它也会降低速度。