解常微分方程组

news2025/7/21 11:52:08

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.coloradmin.cn/o/2395278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++实现汉诺塔游戏自动完成

目录 一、汉诺塔的规则二、数学递归推导式三、步骤实现(一)汉诺塔模型(二)递归实现(三)显示1.命令行显示2.SDL图形显示 四、处理用户输入及SDL环境配置五、总结六、源码下载 一、汉诺塔的规则 游戏由3根柱子和若干大小不一的圆盘组成&#xff0c;初始状态下&#xff0c;所有的…

pikachu靶场通关笔记07 XSS关卡03-存储型XSS

目录 一、XSS 二、存储型XSS 三、源码分析 四、渗透实战 1、输入mooyuan试一试 2、注入Payload 3、查看数据库 4、再次进入留言板页面 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风险的…

OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模块中提供的一个类&#xff0c;用于在 GPU 上执行对比度受限的自适应直方图均衡&#xff08;Contrast Limi…

华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.

最近为一个spring-boot项目下了mysql-9.3.0&#xff0c;结果因为mysql版本太新一直报错连不上。 错误如下&#xff1a; 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…

MacOS安装Docker Desktop并汉化

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

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…

使用 HTML + JavaScript 实现在线考试系统

在现代的在线教育平台中&#xff0c;在线考试系统是不可或缺的一部分。本文将通过一个完整的示例&#xff0c;演示如何使用 HTML、CSS 和 JavaScript 构建一个支持多种题型的在线考试系统。 效果演示 项目概述 本项目主要包含以下核心功能&#xff1a; 支持4种常见题型&…

谷歌工作自动化——仙盟大衍灵机——仙盟创梦IDE

下载地址 https://chromewebstore.google.com/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd https://chrome.zzzmh.cn/info/mooikfkahbdckldjjndioackbalphokd

秒杀系统—1.架构设计和方案简介

大纲 1.秒杀系统的方案设计要点 2.秒杀系统的数据 页面 接口的处理方案 3.秒杀系统的负载均衡方案底层相关 4.秒杀系统的限流机制和超卖问题处理 5.秒杀系统的异步下单和高可用方案 1.秒杀系统的方案设计要点 (1)秒杀促销活动的数据处理 (2)秒杀促销活动的页面处理 (…

基于FashionMnist数据集的自监督学习(生成式自监督学习AE算法)

目录 一&#xff0c;生成式自监督学习 1.1 简介 1.2 核心思想 1.3 常见算法 1.3.1 自动编码器&#xff08;Autoencoder&#xff09; 1.3.2 生成对抗网络&#xff08;GANs&#xff09; 1.3.3 变分自编码器&#xff08;VAE&#xff09; 1.3.4 Transformer-based 模型&…

从监控到告警:Prometheus+Grafana+Alertmanager+告警通知服务全链路落地实践

文章目录 一、引言1.1 监控告警的必要性1.2 监控告警的基本原理1.2.1 指标采集与存储1.2.2 告警规则与触发机制1.2.3 多渠道通知与闭环 二、技术选型与架构设计2.1 为什么选择 Prometheus 及其生态2.1.1 Prometheus 优势分析2.1.2 Grafana 可视化能力2.1.3 Alertmanager 灵活告…

WPF【09】WPF基础入门 (三层架构与MVC架构)

9-2 【操作】WPF 基础入门 新建一项目 Create a new project - WPF Application (A project for creating a .NET Core WPF Application) - Next - .NET 5.0 (Current) - Create 项目创建完成&#xff0c;VS自动打开 GUI用户界面&#xff0c;格式是 .xaml文件&#xff0c;跟xm…

macOS 风格番茄计时器:设计与实现详解

macOS 风格番茄计时器&#xff1a;设计与实现详解 概述 本文介绍一款采用 macOS 设计语言的网页版番茄计时器实现。该计时器完全遵循苹果的人机界面指南(HIG)&#xff0c;提供原汁原味的 macOS 使用体验&#xff0c;同时具备响应式设计和深色模式支持。 核心特性 原生 macOS…

oracle goldengate实现远程抽取postgresql 到 postgresql的实时同步【绝对无坑版,亲测流程验证】

oracle goldengate实现postgresql 到 postgresql的实时同步 源端&#xff1a;postgresql1 -> postgresql2 流复制主备同步 目标端&#xff1a;postgresql 数据库版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架构图&#xff1a; 数据库安装以及流复制主备…

ISCC-2025-web-wp

web 校赛 校赛靠着ENOCH师傅发力&#xff0c;也是一路躺进了区域赛&#xff0c;E师傅不好意思发这抽象比赛的wp(这比赛确实啥必到让人大开眼界&#xff0c;反正明年我是肯定不会打了)&#xff0c;我就顺手要过来连着区域赛的一起发了 web 150分 按照提示进入/includes/fla…

King3399(ubuntu文件系统)iic(i2c)功能测试

0 引言 前面两篇博文简要介绍了板子上uart部分的内容&#xff0c;但在驱动开发时&#xff0c;我们遇到的外设更多的是以i2c或spi进行通信&#xff0c;本文将对king3399的i2c进行测试并对硬件电路、设备树与驱动程序进行分析 如果使用的i2c设备不是mma8452&#xff0c;建议先看…

德思特新闻 | 德思特与es:saar正式建立合作伙伴关系

德思特新闻 2025年5月9日&#xff0c;德思特科技有限公司&#xff08;以下简称“德思特”&#xff09;与德国嵌入式系统专家es:saar GmbH正式达成合作伙伴关系。此次合作旨在将 es:saar 的先进嵌入式开发与测试工具引入中国及亚太市场&#xff0c;助力本地客户提升产品开发效率…

基于原生JavaScript前端和 Flask 后端的Todo 应用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 应用 这是一个使用Python Flask框架开发的简单待办事项(Todo)应用&#xff0c;采用前后端分离架构。本项目实现了待办事项的添加、删除、状态切换等基本功能&#xff0c;并提供了直观…

MIT 6.S081 2020 Lab6 Copy-on-Write Fork for xv6 个人全流程

文章目录 零、写在前面一、Implement copy-on write1.1 说明1.2 实现1.2.1 延迟复制与释放1.2.2 写时复制 零、写在前面 可以阅读下 《xv6 book》 的第五章中断和设备驱动。 问题 在 xv6 中&#xff0c;fork() 系统调用会将父进程的整个用户空间内存复制到子进程中。**如果父…