matlab 橡皮筋的攻击:旋转发射控制弹道特性

e0uiprwp  于 7个月前  发布在  Matlab
关注(0)|答案(1)|浏览(56)

我是一名大学生。在完成我的工作时,我使用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之间的关系

bpzcxfmw

bpzcxfmw1#

通过调试,我能够发现两个dvx_dt,dvy_dt都有2个重合的解决方案:

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];

特别是:
dvy_dt =
1.0e+03 *
-7.3477 -7.3477

dvx_dt 1.0e+03 *

7.3379
7.3379

因此,当你使用dy = [dvx_dt; dvy_dt; vx; vy];时,dy大小为6。
然后将初始条件y0传递给ode45,该初始条件的大小为5,导致错误。
根据文件:
初始条件,指定为向量。y 0必须与odefun的向量输出长度相同,这样y 0就包含了odefun中定义的每个方程的初始条件。
如何处理偏微分方程dvx_dt,dvy_dt的二重重合结果,由你自己决定。不幸的是,这超出了我的知识范围。

相关问题