解常微分方程组

article/2025/6/24 4:22:25

Euler法

function euler_method

    % 参数设置

    v_missile = 450; % 导弹速度 km/h

    v_enemy = 90; % 敌艇速度 km/h

    % 初始条件

    x0 = 0; % 导弹初始位置 x

    y0 = 0; % 导弹初始位置 y

    xe0 = 120; % 敌艇初始位置 y

    t0 = 0; % 初始时间

    % 时间步长和总时间

    dt = 0.01; % 时间步长

    t_final = 0.28; % 终止时间

    % 初始化变量

    t = t0:dt:t_final;

    n = length(t);

    x = zeros(1, n);

    y = zeros(1, n);

    xe = 90 * t;

    ye = xe0 * ones(1, n);

    x(1) = x0;

    y(1) = y0;

    % 欧拉法

    for i = 1:n-1

        dx = xe(i) - x(i);

        dy = ye(i) - y(i);

        distance = sqrt(dx^2 + dy^2);

        x(i+1) = x(i) + 450 * dx / distance * dt;

        y(i+1) = y(i) + 450 * dy / distance * dt;

        if y(i+1)>=xe0% 判定击中条件

            fprintf('欧拉法: 击中时间: %.2f 小时\n', t(i));

            fprintf('欧拉法: 击中位置: (%.2f, %.2f)\n', x(i), y(i));

            break;

        end

    end

[t;x;y]'

    % 绘图

    figure;

    plot(x, y, 'r', xe, ye, 'b');

    legend('导弹轨迹', '敌艇轨迹');

    xlabel('x (km)');

    ylabel('y (km)');

    title('导弹追击敌艇轨迹 - 欧拉法');

    grid on;

end

Matlab运行结果界面:

改进欧拉法:

function improved_euler_method

    % 参数设置

    v_missile = 450; % 导弹速度 km/h

    v_enemy = 90; % 敌艇速度 km/h

    % 初始条件

    x0 = 0; % 导弹初始位置 x

    y0 = 0; % 导弹初始位置 y

    xe0 = 120; % 敌艇初始位置 y

    t0 = 0; % 初始时间

    % 时间步长和总时间

    dt = 0.01; % 时间步长

t_final = 0.30; % 终止时间

    % 初始化变量

    t = t0:dt:t_final;

    n = length(t);

    x = zeros(1, n);

    y = zeros(1, n);

    xe = 90 * t;

    ye = xe0 * ones(1, n);

    x(1) = x0;

y(1) = y0;

    % 改进欧拉法

    for i = 1:n-1

        dx = xe(i) - x(i);

        dy = ye(i) - y(i);

        distance = sqrt(dx^2 + dy^2);

        x_star = x(i) + 450 * dx / distance * dt;

        y_star = y(i) + 450 * dy / distance * dt;

        dx_star = xe(i+1) - x_star;

        dy_star = ye(i+1) - y_star;

        distance_star = sqrt(dx_star^2 + dy_star^2);

        x(i+1) = x(i) + 0.5 * 450 * (dx / distance + dx_star / distance_star) * dt;

        y(i+1) = y(i) + 0.5 * 450 * (dy / distance + dy_star / distance_star) * dt;

        if y(i)>=xe0 % 判定击中条件

            fprintf('改进欧拉法: 击中时间: %.2f 小时\n', t(i));

            fprintf('改进欧拉法: 击中位置: (%.2f, %.2f)\n', x(i), y(i));

            break;

        end

    end

[t;x;y]'

    % 绘图

    figure;

    plot(x, y, 'r', xe, ye, 'b');

    legend('导弹轨迹', '敌艇轨迹');

    xlabel('x (km)');

    ylabel('y (km)');

    title('导弹追击敌艇轨迹 - 改进欧拉法');

    grid on;

end

龙格库塔法:

function runge_kutta_method

    % 参数设置

    v_missile = 450; % 导弹速度 km/h

    v_enemy = 90; % 敌艇速度 km/h

    % 初始条件

    x0 = 0; % 导弹初始位置 x

    y0 = 0; % 导弹初始位置 y

    xe0 = 120; % 敌艇初始位置 y

    t0 = 0; % 初始时间

    % 时间步长和总时间

    dt = 0.01; % 时间步长

    t_final = 0.3; % 终止时间

    % 初始化变量

    t = t0:dt:t_final;

    n = length(t);

    x = zeros(1, n);

    y = zeros(1, n);

    xe = 90 * t;

    ye = xe0 * ones(1, n);

    x(1) = x0;

    y(1) = y0;

    % 龙格库塔法

    for i = 1:n-1

        k1x = 450 * (xe(i) - x(i)) / sqrt((xe(i) - x(i))^2 + (ye(i) - y(i))^2);

        k1y = 450 * (ye(i) - y(i)) / sqrt((xe(i) - x(i))^2 + (ye(i) - y(i))^2);

        k2x = 450 * (xe(i) - (x(i) + 0.5 * dt * k1x)) / sqrt((xe(i) - (x(i) + 0.5 * dt * k1x))^2 + (ye(i) - (y(i) + 0.5 * dt * k1y))^2);

        k2y = 450 * (ye(i) - (y(i) + 0.5 * dt * k1y)) / sqrt((xe(i) - (x(i) + 0.5 * dt * k1x))^2 + (ye(i) - (y(i) + 0.5 * dt * k1y))^2);

        k3x = 450 * (xe(i) - (x(i) + 0.5 * dt * k2x)) / sqrt((xe(i) - (x(i) + 0.5 * dt * k2x))^2 + (ye(i) - (y(i) + 0.5 * dt * k2y))^2);

        k3y = 450 * (ye(i) - (y(i) + 0.5 * dt * k2y)) / sqrt((xe(i) - (x(i) + 0.5 * dt * k2x))^2 + (ye(i) - (y(i) + 0.5 * dt * k2y))^2);

        k4x = 450 * (xe(i) - (x(i) + dt * k3x)) / sqrt((xe(i) - (x(i) + dt * k3x))^2 + (ye(i) - (y(i) + dt * k3y))^2);

        k4y = 450 * (ye(i) - (y(i) + dt * k3y)) / sqrt((xe(i) - (x(i) + dt * k3x))^2 + (ye(i) - (y(i) + dt * k3y))^2);

        x(i+1) = x(i) + (1/6) * dt * (k1x + 2*k2x + 2*k3x + k4x);

        y(i+1) = y(i) + (1/6) * dt * (k1y + 2*k2y + 2*k3y + k4y);

        distance = sqrt((xe(i+1) - x(i+1))^2 + (ye(i+1) - y(i+1))^2);

        if  y(i+1)-y(i)<0.001% 判定击中条件

            fprintf('龙格库塔法: 击中时间: %.2f 小时\n', t(i));

            fprintf('龙格库塔法: 击中位置: (%.2f, %.2f)\n', x(i), y(i));

            break;

        end

    end

[t;x;y]'

    % 绘图

    figure;

    plot(x, y, 'r', xe, ye, 'b');

    legend('导弹轨迹', '敌艇轨迹');

    xlabel('x (km)');

    ylabel('y (km)');

    title('导弹追击敌艇轨迹 - 龙格库塔法');

    grid on;

end

仿真算法:

function fangzhen(h)

L = 120;Vs = 90;Vm = 450;

x(1) = 0;y(1) = 0;

for i = 1:1e6

    M = sqrt(((i - 1)*Vs*h - x(i)).^2 + (L - y(i)).^2);

    ctheta = ((i - 1)*Vs*h - x(i))./M;

    stheta = (L - y(i))./M;

    x(i+1) = x(i) + Vm*h*ctheta;

    y(i+1) = y(i) + Vm*h*stheta;

    if y(i+1) >= L

        break;

    end

end

plot(x,y,x(1):0.01:x(end),L)

x = x(end)

y = y(end)

t = x / Vs

通过本次实验我学会了对实际问题建立模型,然后借助数值计算的方法:EULER法、预报校正法—改进欧拉法、龙格库塔法来求解模型进而解决实际问题。

掌握了欧拉方法、改进欧拉法、龙格库塔法的算法迭代过程,并编写matlab程序并运行程序,这期间我也手工迭代了三次,将两者结果进行比对后发现结果一致,证实迭代过程没有问题;训练了我对实际问题的建模能力和使用数值计算方法解决实际问题的能力。

发现了步长对于结果的影响,此外还发现了自己在建立模型过程中和计算求解时的一些不足。matlab程序编写时的能力需要提高,尤其是提高代码的简洁性且输出想要的结果的能力。今后我的思考问题的能力和给实际问题建立数学模型的能力也有待提高。


http://www.hkcw.cn/article/RuwHSHXqLJ.shtml

相关文章

「Java教案」数据类型、变量与常量

课程目标 1&#xff0e;知识目标 能够根据Java基本数据类型的分类、存储规则及适用场景&#xff0c;合理的选择数据类型。能在合适的场景下正确声明和定义变量和常量。能够根据显式和隐式数据类型转换的规则与风险&#xff0c;合理的进行数据类型转换。 2&#xff0e;能力目…

本地部署基于 Kibana 开源搜索引擎 Elasticsearch 并实现外部访问

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。Kibana 是一个开源可视化工具&#xff0c;用于与 Elasticsearch 进行集成&#xff0c;提供大量数据分析。 本文将详细的介绍如何利用 Docker 在本地部署…

【Ollama】windows部署ollama并运行模型

一、Ollama安装 1.下载Ollama 官网&#xff1a;https://ollama.com/ 2.安装 点击下载 安装完成后打开cmd窗口 键盘按住WinR输入cmd 3.Ollama常用指令 指令说明ollama list查看本地已下载的模型列表ollama pull <模型名>下载模型&#xff08;如 ollama pull llama…

Linux入门(十二)服务管理

服务本质就是进程&#xff0c;但是在后台运行&#xff0c;通常会监听某个端口&#xff0c;等等其他的程序来访问 systemctl 管理指令 systemctl [start | stop | restart | reload | status ] systemctl status NetworkManagersystemctl 服务是在/usr/lib/systemd/system 查看 …

在Ubuntu20.04上安装ROS Noetic

本章教程,主要记录在Ubuntu20.04上安装ROS Noetic。 一、添加软件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、设置秘钥 …

Linux 库制作与原理

文章目录 1. 库的概念2. 静态库2.1 静态库的制作2.2 静态库的原理 3. 动态库的制作4.ELF文件4.1 ELF文件内容4.2 ELF文件链接与加载 5. ELF与进程地址空间&#xff0c;动静态链接和库5.1 ELF与静态链接5.2 ELF与进程地址空间5.3 ELF与动态链接、动态库5.3.2 动态库5.3.2 动态链…

26考研——文件管理_文件目录(4)

408答疑 文章目录 二、文件目录1、目录的作用与结构1.1、目录的基本概念1.2、目录的组织形式1.2.1、单级目录结构1.2.2、两级目录结构1.2.3、多级&#xff08;树形&#xff09;目录结构1.2.4、无环图目录结构 1.3、目录的实现方式1.3.1、线性列表1.3.2、哈希表 2、文件共享与链…

俄军操作系统 Astra Linux 安装教程

安装 U盘制作 Rufus 写盘工具&#xff1a;https://rufus.ie/ Astra Linux ISO 镜像文件&#xff1a;https://dl.astralinux.ru/astra/stable/2.12_x86-64/iso/ 准备一个8g以上的u盘&#xff0c;打开Rufus写盘工具&#xff0c;选择下载的iso镜像&#xff0c;写入u盘&#xff…

MacOS安装Docker Desktop并汉化

1. 安装Docker Desktop 到Docker Desktop For Mac下载对应系统的Docker Desktop 安装包&#xff0c;下载后安装&#xff0c;没有账号需要注册&#xff0c;然后登陆即可。 2. 汉化 前往汉化包下载链接下载对应系统的.asar文件 然后将安装好的文件覆盖原先的文件app.asar文件…

AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 你有没有想过&#xff0c;能不能通过简单的规则模拟出生与死亡&#xff1f;「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇&#xff0c;并用 S…

系统设计——系统架构分层设计经验

摘要 文章通过对 MVC 三层架构和 DDD 四层架构的深入分析&#xff0c;结合具体的代码示例和项目结构设计&#xff0c;为 Java 开发人员提供了全面的系统架构分层设计经验。在实际项目中&#xff0c;开发人员应根据项目的规模和业务复杂度选择合适的架构模式&#xff0c;并遵循…

Windows下编译zlib

本文记录在Windows下编译zlib的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译 1.1 下载代码 git clone https://github.com/madler/zlib.git 1.2 构建 按照下表配置CMake&#xff0c; CMake…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a; 定义其实坐标&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。进入while循环&#xff08;注意边界条件&#xff0c;行数小于m&#xff0c;列数要&#xff1e;0&#xff09;从右上角开始开始向左遍历&#xff08;比当…

域权限维持和后渗透密码收集

前言 本文仅用于网络安全领域的教育和研究目的&#xff0c;旨在帮助安全研究人员和渗透测试人员了解和防范黄金票据攻击与白银票据攻击。所有技术的使用必须在合法授权的环境下进行&#xff0c;未经授权的攻击行为是违法的。本文的目标是提高网络安全防护能力&#xff0c;帮助企…

法规解读——GB/T 前向碰撞预警功能FCW

一、前言 前方车辆碰撞预警系统是前向摄像头和前向毫米波能检测前方目标车辆并计算是否满足报警条件&#xff0c;在危险紧急情况下警告驾驶员采取刹车换道等操作避免碰撞。本文以GB/T 33577记录相关规范要求。 二、术语 碰撞报警 collision warning 系统向驾驶员发出需紧急避碰…

Vue-过滤器

过滤器 时间戳格式化 实现方式 计算属性方法过滤器 基础依赖 day.min.js 下载链接放到 相对路径 js 目录下 Computed 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>过滤器</title>…

Java 文件操作 和 IO(4)-- Java文件内容操作(2)-- 字符流操作

Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作 文章目录 Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作观前提醒&#xff1a;1. Java中操作文件的简单介…

【Qt】EventFilter,要增加事件拦截器才能拦截到事件

在构造函数中增加事件拦截器 void QObject::installEventFilter(QObject *filterObj) Installs an event filter filterObj on this object. For example:

Cypress + React + TypeScript

🧪 Cypress + React + TypeScript 组件测试全流程实战:从入门到自动化集成 在现代前端开发中,组件测试 是保障 UI 行为可靠性的重要手段。本文将通过一个 React 项目示例,实战演示如何结合 Cypress + React + TypeScript 实现从零配置到自动化集成的完整测试链路。 一、项…

cf每日刷题

目录 String&#xff08;800&#xff09; Skibidus and Amogu&#xff08;800&#xff09; Apples in Boxes&#xff08;1100&#xff09; String&#xff08;800&#xff09; https://codeforces.com/problemset/problem/2062/A #include <iostream> #include <…