实现问题与象征性的ode采用数值函数名称返回一个向量的长度是1但初始条件向量的长度是12。

9的观点(30天)
整个下午我一直盘旋在错误和浇注后mathwork论坛和答案部分我终于确定了这两个错误,我不知道如何解决。
我们的想法是,我有一些方程组组件随时间和我象征性地构建这个系统方程返回之前回到我的主要功能运行数值解算器。我一直错误像r之间摆动 eturns向量的长度是1但初始条件矢量的长度是12 当我使用odefun = matlabFunction下面代码中所示 使用superiorfloat错误,输入必须漂浮,即单引号或双 当我使用[dydt Y] = odeToVectorField。我不确定如何打包回来我取悦所有功能正常运转:/
主函数调用
函数[T、Y] = call_osc_1BodyKane2Verification011823 ()
tspan = (10 0);
g = 9.81;% m / s2
initVec = [0 0 0 0 0 0 100 - g 0 0 0 0];
[T] =数值(@osc_1BodyKane_2Verification011823, tspan initVec);
% [T] =数值(@ (T) osc_1BodyKane_2Verification011823 (T), tspan, initVec);
(这里策划的东西)
结束
然后我打电话的功能
函数odefun = osc_1BodyKane_2Verification011823(时间,Y)
%函数dydt = osc_1BodyKane_2Verification011823(时间,Y)
%函数[dydt Y] = osc_1BodyKane_2Verification011823(时间,Y)
信谊q1 (t) q2 (t)第三(t)第四季度(t) q5 (t) q6 (t)
%广义速度
% (q1 = xi, q2 =咦,第三季度=子,第四季度=θ,q5 =φ,q6 = psi)
% dydt = 0(12日1);
g = 9.81;% m / s ^ 2
ρ= 1.225;% ^ 3公斤/米
mB = 10;%的通用
mPlate = 6;
rPlate = 6;
hPlate = 1;
%计算力
FLaunch = getLaunchForce(时间);
FAero = getAeroForce (Y,ρ)
FWeight = m * g
FThrust = FAero (1)
Fbx = FLaunch + FAero (1) + FThrust;
Fby = FAero (2);
Fbz = FAero (3) + -FWeight;
% Fbx = 0;
% Fby = 0;
% Fbz = 0;
质量%的时刻
Ib = 0 (3、3);
IBxx = 1/12 * m * (3 * rPlate * rPlate + hPlate * hPlate)
IByy = 1/12 * mPlate * (3 * rPlate * rPlate + hPlate * hPlate)
IBzz = 1/2 * mPlate * rPlate * rPlate
磅= 0;
Mb = 0;
Nb = 0;
u4 = diff (q5) - diff (q6) * sin(第四季度);
u5 = diff (q4) * cos (q5) + diff (q6) * cos (q4) * sin (q5);
u6 = diff (q6) * cos (q4) * cos (q5) - diff (q4) * sin (q5);
u1 = diff (q1) + u5 *第三季——u6 * q2;
u2 = diff (q2)——u4 * q3 + u6 * q1;
u3 = diff (q3) + u4 * q2 - u5 * q1;
u1dot = diff (u1);
u2dot = diff (u2);
u3dot = diff (u3);
u4dot = diff(愉快);
u5dot = diff (u5);
u6dot = diff (u6);
Kanes1 = Fbx - mB * (u1dot u2 * u6 + u3 * u5);
Kanes2 = Fby - mB * (u2dot + u1 * u6, u3 * u4);
Kanes3 = Fbz - mB * (u3dot - u1 * u5 + u2 * u4);
Kanes4 =磅+ Fby * q3 - Fbz * q2 IBxx * u4dot + IByy * u5 * u6 - IBzz * u5 * * q2 * u3dot u6 + mB - mB * q3 * u2dot mB * q2 * u1 * u5 + mB * q2 * u2 * u4 - mB * q3 * u1 * u6 + mB * q3 * u3 *的愉快;
Kanes5 = Mb - 0.5000 * *第三季- 0.5000 * Fbx Fbx * q6 + Fbz * q1 - IByy * u5dot - 0.5000 * Fbx * q3 * cos (2 * q5) + 0.5000 * Fbx * q6 * cos (2 * q5) - IBxx * u4 * u6 + IBzz * u4 * u6 - Mb * q1 * u3dot + 0.5000 * Mb * q3 * u1dot + 0.5000 * m * q6 * u1dot + Mb * q1 * u1 * u5 - Mb * q1 * u2 * u4 - 0.5000 * m * q3 * u2 * u6 + 0.5000 * m * * u3 *第三季度u5 - 0.5000 * m * q6 * u2 * u6 + 0.5000 * m * q6 * u3 * u5 + 0.5000 * m * q3 * u1dot * cos (2 * q5) - 0.5000 * m * q6 * u1dot * cos (2 * q5) - 0.5000 * m * * u2 *第三季度u6 * cos (2 * q5) + 0.5000 * m * q3 * u3 * u5 * cos (2 * q5) + 0.5000 * m * q6 * u2 * u6 * cos (2 * q5) - 0.5000 * m * q6 * u3 * u5 * cos (2 * q5);
Kanes6 = Nb + Fbx * q2 - Fby * q1 IBzz * u6dot + 0.5000 * Fbx * q3 *罪(2 * q5) - 0.5000 * Fbx * q6 *罪(2 * q5) + IBxx * u4 * u5 - IByy * u4 * u5 + mB q1 * u2dot - mB * * * u1dot + mB * q1 * u1 * u6 - mB q1 * u3 * u4 + mB * * * u2 * u6 q2 - mB * * u3 * u5 - 0.5000 * m * q3 * u1dot *罪(2 * q5) + 0.5000 * m * q6 * u1dot *罪(2 * q5) + 0.5000 * m * * u2 * u6第三季度*罪(2 * q5) - 0.5000 * m * * u3 * u5 *第三季度罪(2 * q5) - 0.5000 * m * q6 * u2 * u6 *罪(2 * q5) + 0.5000 * m * q6 * u3 * u5 *罪(2 * q5);
% Y = [q6,第四季度,Dq4 q1, Dq1 Dq6,第三季度,Dq3, q5, Dq5, q2, Dq2]
[dydt Y] = odeToVectorField (Kanes1 = = 0, Kanes2 = = 0, Kanes3 = = 0, Kanes4 = = 0, Kanes5 = = 0, Kanes6 = = 0)
% dydt = odeFunction (dydt, Y)
%类(dydt)
%类(Y)
odefun = matlabFunction (dydt,“var”,{t,“Y”})
结束
我调用相同的函数,getLaunchForce getAeroForce在其他代码我confindent他们不是问题。
谢谢!
5个评论
梅根Frisbey
梅根Frisbey 2023年1月25日
也要注意从凯恩动力学方程的将产生一组常微分方程。我可能实现错误(我想我需要设置6个方程等于我udot条款而不是允许替换成凯恩方程,然后问odeToVectorField减少让步)这是我最近想知道,但odeToVectorField让步的一组常微分方程。如果这有助于解释得更好。

登录置评。

答案(2)

克里斯·拉皮埃尔
克里斯·拉皮埃尔 2023年1月24日
我建议数值函数内部移动。这是借用了一个例子 odeToVectorField文档页面
tspan = 20 [0];
initVec = [2 0];
ySol = osc_1BodyKane_2Verification011823 (tspan initVec);
tValues = linspace (0, 20100);
yValues =德瓦尔(ySol tValues 1);
情节(tValues yValues)
函数ySol = osc_1BodyKane_2Verification011823 (tspan initVec)
信谊y (t)
eqn = diff (y, 2) = = (1 y ^ 2) * diff - y (y);
V = odeToVectorField (eqn);
M = matlabFunction (V,“var”,{“t”,“Y”});
ySol =数值(M, tspan, initVec);
结束
2的评论
梅根Frisbey
梅根Frisbey 2023年1月25日
我可以移动它内部和之前所做的,但这并不让我选择获得象征性的一组不同的颂歌以来在每个时间步长函数getAeroForce和getLaunchForce依赖时间和之前的时间步的解决方案。(除非我遗漏了什么东西?)
简单地删除@时得到错误 没有足够的输入参数。 你的意思是说
[T] =数值(osc_1BodyKane_2Verification011823 (T), tspan, initVec);
吗?
谢谢

登录置评。


克里斯·拉皮埃尔
克里斯·拉皮埃尔 2023年1月25日
编辑:克里斯·拉皮埃尔 2023年1月25日
谢谢你分享你所有的功能。如果你的方程是改变每一个步伐,我觉得你不能仅仅从odefun返回符号函数。我相信你需要评估它并返回一个向量的12个值时间步。我想这就是为什么你得到了一个错误关于1-element向量(只是一个象征性的函数),当一个向量initVec预计长度一样。
修改您的odefun函数来评估odefun在当前时间和前面的Y值使用下面的代码:
yNew = odefun(时间,Y);
yNew 函数返回的是什么 odefun 。这些输出成为下一次迭代的输入。时间自动增加。
这确实需要很长时间运行(约一个小时对我来说)。你可以加速通过添加分号来抑制输出所有代码。
tspan = (10 0);
g = 9.81;% m / s2
initVec = [0 0 0 0 0 0 100 - g 0 0 0 0];
[T] =数值(@osc_1BodyKane_2Verification011823, tspan initVec);
情节(T (: 1))
函数Ynew = osc_1BodyKane_2Verification011823(时间,Y)
%函数dydt = osc_1BodyKane_2Verification011823(时间,Y)
%函数[dydt Y] = osc_1BodyKane_2Verification011823(时间,Y)
信谊q1 (t) q2 (t)第三(t)第四季度(t) q5 (t) q6 (t)
g = 9.81;% m / s ^ 2
ρ= 1.225;% ^ 3公斤/米
mB = 10;%的通用
mPlate = 6;
rPlate = 6;
hPlate = 1;
%计算力
FLaunch = getLaunchForce(时间);
FAero = getAeroForce (Y,ρ);
FWeight = m * g;
FThrust = FAero (1);
Fbx = FLaunch + FAero (1) + FThrust;
Fby = FAero (2);
Fbz = FAero (3) + -FWeight;
质量%的时刻
Ib = 0 (3、3);
IBxx = 1/12 * m * (3 * rPlate * rPlate + hPlate * hPlate);
IByy = 1/12 * mPlate * (3 * rPlate * rPlate + hPlate * hPlate);
IBzz = 1/2 * mPlate * rPlate * rPlate;
磅= 0;
Mb = 0;
Nb = 0;
u4 = diff (q5) - diff (q6) * sin(第四季度);
u5 = diff (q4) * cos (q5) + diff (q6) * cos (q4) * sin (q5);
u6 = diff (q6) * cos (q4) * cos (q5) - diff (q4) * sin (q5);
u1 = diff (q1) + u5 *第三季——u6 * q2;
u2 = diff (q2)——u4 * q3 + u6 * q1;
u3 = diff (q3) + u4 * q2 - u5 * q1;
u1dot = diff (u1);
u2dot = diff (u2);
u3dot = diff (u3);
u4dot = diff(愉快);
u5dot = diff (u5);
u6dot = diff (u6);
Kanes1 = Fbx - mB * (u1dot u2 * u6 + u3 * u5);
Kanes2 = Fby - mB * (u2dot + u1 * u6, u3 * u4);
Kanes3 = Fbz - mB * (u3dot - u1 * u5 + u2 * u4);
Kanes4 =磅+ Fby * q3 - Fbz * q2 IBxx * u4dot + IByy * u5 * u6 - IBzz * u5 * * q2 * u3dot u6 + mB - mB * q3 * u2dot mB * q2 * u1 * u5 + mB * q2 * u2 * u4 - mB * q3 * u1 * u6 + mB * q3 * u3 *的愉快;
Kanes5 = Mb - 0.5000 * *第三季- 0.5000 * Fbx Fbx * q6 + Fbz * q1 - IByy * u5dot - 0.5000 * Fbx * q3 * cos (2 * q5) + 0.5000 * Fbx * q6 * cos (2 * q5) - IBxx * u4 * u6 + IBzz * u4 * u6 - Mb * q1 * u3dot + 0.5000 * Mb * q3 * u1dot + 0.5000 * m * q6 * u1dot + Mb * q1 * u1 * u5 - Mb * q1 * u2 * u4 - 0.5000 * m * q3 * u2 * u6 + 0.5000 * m * * u3 *第三季度u5 - 0.5000 * m * q6 * u2 * u6 + 0.5000 * m * q6 * u3 * u5 + 0.5000 * m * q3 * u1dot * cos (2 * q5) - 0.5000 * m * q6 * u1dot * cos (2 * q5) - 0.5000 * m * * u2 *第三季度u6 * cos (2 * q5) + 0.5000 * m * q3 * u3 * u5 * cos (2 * q5) + 0.5000 * m * q6 * u2 * u6 * cos (2 * q5) - 0.5000 * m * q6 * u3 * u5 * cos (2 * q5);
Kanes6 = Nb + Fbx * q2 - Fby * q1 IBzz * u6dot + 0.5000 * Fbx * q3 *罪(2 * q5) - 0.5000 * Fbx * q6 *罪(2 * q5) + IBxx * u4 * u5 - IByy * u4 * u5 + mB q1 * u2dot - mB * * * u1dot + mB * q1 * u1 * u6 - mB q1 * u3 * u4 + mB * * * u2 * u6 q2 - mB * * u3 * u5 - 0.5000 * m * q3 * u1dot *罪(2 * q5) + 0.5000 * m * q6 * u1dot *罪(2 * q5) + 0.5000 * m * * u2 * u6第三季度*罪(2 * q5) - 0.5000 * m * * u3 * u5 *第三季度罪(2 * q5) - 0.5000 * m * q6 * u2 * u6 *罪(2 * q5) + 0.5000 * m * q6 * u3 * u5 *罪(2 * q5);
% Y = [q6,第四季度,Dq4 q1, Dq1 Dq6,第三季度,Dq3, q5, Dq5, q2, Dq2]
dydt = odeToVectorField (Kanes1 = = 0, Kanes2 = = 0, Kanes3 = = 0, Kanes4 = = 0, Kanes5 = = 0, Kanes6 = = 0);
odefun = matlabFunction (dydt,“var”,{t,“Y”});
Ynew = odefun(时间,Y);% # # # # # # # # # # # # # # # #添加这条线评估odefun在当前时间步
结束
函数AeroForce = getAeroForce (y,ρ)
g = 9.98;
aoa = y (11);
S = 9;%注1英尺mac, 9英尺
u = y (1);
v = y (2);
w = y (3);
韦尔(12 (u * u + v * v + w * w);
aero = CLCD (aoa);
CL =航空(1);
CD =航空(2);
CD xForce = - 0.5 * *ρ*或者*或者*年代;
yForce = 0;
zForceρ= 0.5 * CL * *或者*或者*年代;
AeroForce = [xForce yForce zForce];
结束
函数LiftDrag = CLCD (aoa)
alphaL = 5;
alphaH = 10;%的线性区域,从经典的克拉克Y的占位符
CL_L = -0.2;
CL_H = 1.35;
profileDrag = 0.015;
oswaldE = 0.9;
基于“增大化现实”技术= 9;
coeffDHEnd =罪(2 *成熟女性(18 - 45)/ 180 *π)+ 1.0;
coeffLDEnd = cos(2.0 *(成熟女性(18 - 45)/ 180 *π));
lastLinearCD = 0;
如果aoa < = alphaH & & aoa > alphaL
m = (CL_H-CL_L) / (alphaH - alphaL);
b = CL_L - m * alphaL;
coeffLift = m * aoa + b;
coeffDrag = profileDrag + coeffLift ^ 2 /(π* oswaldE * AR);
lastLinearCD = coeffDrag;
elseifaoa > alphaH & & aoa < = (alphaH + 8)
m = (CL_H - coeffLDEnd) / (alphaH - (8 + alphaH));
coeffLift = m * aoa + CL_H - m * alphaH;
coeffDrag = lastLinearCD + (lastLinearCD-coeffDHEnd) / (alphaH - (alphaH + 8)) * (aoa-10);
其他的
coeffLift = cos (2.0 * ((aoa / 180 *π)-45/180 *π));
coeffDrag =罪(2 * ((aoa-45) / 180 *π))+ 1.0;
结束
LiftDrag (1) = coeffLift;
LiftDrag (2) = coeffDrag;
结束
函数launchForce = getLaunchForce (t)
g = 9.98;
tLimit = 1;
如果t < tLimit
launchForce = 20 * g - 20 * g * t;
其他的
launchForce = 0;
结束
结束
我不知道什么是预期的结果,但是这就是这个代码给我。
4评论
克里斯·拉皮埃尔
克里斯·拉皮埃尔 2023年1月25日
编辑:克里斯·拉皮埃尔 2023年1月25日
在第二个代码片段, odeToVectorField 返回第二个输出, Y 。这是你第二次输入相同的变量名 osc_1BodyKane_2Verification011823 函数,因此覆盖它。当你去下一行代码, Y 不再是一个向量的数字,而是现在一个向量符号替换。这是生产错误。
所以没什么错的语法得到第二个输出 odeToVectorField 。你只需要使用一个不同的变量名。
[dydt, Ysubs] = odeToVectorField (Kanes1 = = 0, Kanes2 = = 0, Kanes3 = = 0, Kanes4 = = 0, Kanes5 = = 0, Kanes6 = = 0);
但因为你不需要输出或使用,你也可以把它完全,像我一样。

登录置评。

下载188bet金宝搏


释放

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!