第一次发布在这里。非常沮丧,现在正在为这个班级工作。
基本上,我们的想法是使用欧拉方法来模拟和绘制运动方程。运动方程是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卡住了,我尝试让它运行几分钟但不会执行。我最终不得不关闭并重新打开该应用程序。
答案 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
的调用,因为它也会降低速度。