1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
options = optimoptions('fsolve', ... 'Display', 'iter', ... 'TolFun', 1e-8, ... 'Algorithm', 'levenberg-marquardt');
initial_guess = [10, 0.44];
[solution, fval] = fsolve(@projectile_system, initial_guess, options);
if norm(fval) < 1e-4 time_to_impact = solution(1); angle_rad = solution(2); angle_deg = rad2deg(angle_rad);
fprintf('\n--- 求解结果 ---\n'); fprintf('炮弹击中目标所需时间 (t): %.4f 秒\n', time_to_impact); fprintf('炮弹发射角度 (θ): %.4f 度\n', angle_deg);
S = 6000; v1 = 50; H = 1450; x_impact = S - v1 * time_to_impact; y_impact = H;
fprintf('击中位置坐标 (x, y): (%.2f m, %.2f m)\n', x_impact, y_impact); plot_trajectories(time_to_impact, angle_rad, x_impact, y_impact); else fprintf('\n求解失败,求解器未能收敛到一个解。\n'); disp('最后的函数值 (误差):'); disp(fval); end
function F = projectile_system(vars)
m = 1; k = 0.1; v0 = 500*sqrt(2); g = 9.8; S = 6000; H = 1450; v1 = 50;
t = vars(1); theta = vars(2);
x_projectile = (m/k) * v0 * cos(theta) * (1 - exp(-k*t/m)); x_target = S - v1*t; F(1) = x_projectile - x_target;
y_projectile_term1 = (m/k) * v0 * sin(theta) * (1 - exp(-k*t/m)); y_projectile_term2 = (m*g/k) * t; y_projectile_term3 = (m^2*g/k^2) * (exp(-k*t/m) - 1); F(2) = y_projectile_term1 - y_projectile_term2 - y_projectile_term3 - H; end
function plot_trajectories(time_to_impact, angle_rad, x_impact, y_impact) m = 1; k = 0.1; v0 = 500*sqrt(2); g = 9.8; S = 6000; H = 1450; v1 = 50; t_vector = linspace(0, time_to_impact, 100); x_projectile = (m/k) * v0 * cos(angle_rad) * (1 - exp(-k*t_vector/m)); y_projectile = (m/k) * v0 * sin(angle_rad) * (1 - exp(-k*t_vector/m)) ... - (m*g/k) * t_vector ... - (m^2*g/k^2) * (exp(-k*t_vector/m) - 1); x_target = S - v1 * t_vector; y_target = H * ones(size(t_vector)); figure('Position', [100, 100, 700, 500]); plot(x_projectile, y_projectile, 'b-', 'LineWidth', 2, 'DisplayName', '炮弹轨迹'); hold on; plot(x_target, y_target, 'r--', 'LineWidth', 2, 'DisplayName', '目标轨迹'); plot(x_impact, y_impact, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'red', ... 'DisplayName', sprintf('击中点 (%.1f, %.1f)', x_impact, y_impact)); plot(0, 0, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'green', 'DisplayName', '发射点'); plot(S, H, 'mo', 'MarkerSize', 8, 'MarkerFaceColor', 'magenta', 'DisplayName', '目标起点'); xlabel('水平距离 (m)'); ylabel('高度 (m)'); title('炮弹与目标物轨迹'); legend('Location', 'best'); grid on; axis equal; info_str = sprintf(['求解结果:\n' ... '发射角度: %.2f°\n' ... '飞行时间: %.2f s\n' ... '击中位置: (%.1f, %.1f)\n' ... '目标速度: %.1f m/s\n' ... '炮弹初速: %.1f m/s'], ... rad2deg(angle_rad), time_to_impact, ... x_impact, y_impact, v1, v0); annotation('textbox', [0.02, 0.02, 0.3, 0.2], 'String', info_str, ... 'BackgroundColor', 'white', 'EdgeColor', 'black', ... 'FontSize', 10, 'VerticalAlignment', 'bottom'); end
|