我是一名大学生。在完成我的工作时,我使用MATLAB进行数值模拟,但遇到了一个编程错误。
使用odevarguments @(T,Y)ODEFF(T,Y,G,C_D0,RHO,D,MU,E,F,OMEGA0_INITIAL,C,A,ALPHA 0)时出错,返回长度为6的向量,但初始条件向量的长度为5。由@(T,Y)ODEFFERY(T,Y,G,C_D0,RHO,D,MU,E,F,OMEGA0_INITIAL,C,A,ALPHA 0)返回的向量和初始条件向量必须具有相同数量的元素。
Ode 45(第107行)odearguments(odeIsFuncHandle,odeTreatAsMFile,solver_name,ode,tspan,y 0,options,varargin)中出错;
main中的错误(第29行)[t,y] = ode 45(@(t,y)odefunc(t,y,g,C_D0,rho,d,mu,E,F,omega0_initial,c,A,alpha 0),[0,T],y 0);
% 参数定义
k = 300; % 劲度系数, N/m
m = 0.005; % 橡皮筋的质量, kg
L = 0.20; % 橡皮筋的长度, m
deltaL = 0.15; % 橡皮筋被拉伸的长度, m
d = 0.02; % 自旋的直径, m
rho = 1.225; % 空气密度, kg/m^3 (标准大气条件下)
mu = 1.81e-5; % 动力粘性, Pa.s (标准大气条件下)
C_D0 = 0.47; % 阻力系数的基础值
alpha0 = 0.0001; % 一定存在的偏差,微小量
g = 9.81; % 重力加速度, m/s^2
E = 2.718; % 实验常数
F = 0.33;
c = 10^-4;
A = pi/4 * d^2; % 旋转截面面积
% 使用relation_Energy求解v0和omega0
syms v0 omega0
relation_Energy = 0.5 * k * deltaL^2 == 0.5 * m * v0^2 + 1/3 * m * d^2*omega0^2;
sol = solve(relation_Energy, [v0, omega0]);
v0_initial = double(sol.v0);
omega0_initial = double(sol.omega0);
% 初始条件
y0 = [v0_initial; 0; 0; 1.2]; % 初始x=0, y=1.2
% 使用ode45求解
T = 10; % 假设模拟的总时间为10秒,您可以根据需要修改
[t, y] = ode45(@(t, y) odefunc(t, y, g, C_D0, rho, d, mu, E, F, omega0_initial, c, A, alpha0), [0, T], y0);
% 绘图
plot(y(:,3), y(:,4)); % x vs y
xlabel('x');
ylabel('y');
title('Trajectory');
% 定义ODE函数
function dy = odefunc(t, y, g, C_D0, rho, d, mu, E, F, omega0_initial, c, A, alpha0)
% y(1) = vx
% y(2) = vy
% y(3) = x
% y(4) = y
vx = y(1);
vy = y(2);
theta = atan(vy/vx);
v = sqrt(vx^2 + vy^2);
% 根据vy的符号定义dvy_dt
if vy > 0
dvy_dt = -g - (C_D0 + rho .* d .* v ./ mu .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0).^2) .* rho .* A .* v.* sin(theta) + 2 .* pi .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0) .* rho .* A .* v .* omega0_initial .* exp(-c.*v./d .* t) .* cos(theta);
else
dvy_dt = -g + (C_D0 + rho .* d .* v ./ mu .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0).^2) .* rho .* A .* v.* sin(theta) + 2 .* pi .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0) .* rho .* A .* v .* omega0_initial .* exp(-c.*v./d .* t) .* cos(theta);
end
dvx_dt = -(C_D0 + rho .* d .* v ./ mu .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0).^2) .* rho .* A .* v.* cos(theta) + 2 .* pi .* (E.*exp(-F.*omega0_initial .* exp(-c.*v./d .* t)) + alpha0) .* rho .* A .* v .* omega0_initial .* exp(-c.*v./d .* t) .* sin(theta);
dy = [dvx_dt; dvy_dt; vx; vy];
end
我最终想分析x和\omega之间的关系
1条答案
按热度按时间bpzcxfmw1#
通过调试,我能够发现两个
dvx_dt,dvy_dt
都有2个重合的解决方案:特别是:
dvy_dt =
1.0e+03 *
-7.3477 -7.3477
和
dvx_dt 1.0e+03 *
因此,当你使用
dy = [dvx_dt; dvy_dt; vx; vy];
时,dy
大小为6。然后将初始条件
y0
传递给ode45
,该初始条件的大小为5,导致错误。根据文件:
初始条件,指定为向量。y 0必须与odefun的向量输出长度相同,这样y 0就包含了odefun中定义的每个方程的初始条件。
如何处理偏微分方程
dvx_dt,dvy_dt
的二重重合结果,由你自己决定。不幸的是,这超出了我的知识范围。