高教杯数学建模A题程序设计要点与思路

  • 2023 年是我最后一次参加 高教杯大学生数学建模竞赛 以后不会再参加了(大四参加意义不太,研究生有研究生的数学建模大赛)
    • 很遗憾 由于各种原因 我们没有能够完成赛题
    • 2022 年 美赛 2022年 Mathor Cup 2022 年国赛 2022 亚太杯 2023年 美赛 2023年 国赛
    • 我和我的朋友一共参加了6次比赛
    • 6次比赛 我交到了很好的朋友 
    • 然鹅 成绩比较惨淡 S*1 H*1 省三一次
    • 唉,数模啊数模,很难说出口啊
    • 今年本来特别有信心的,但是,唉,。。。A题,我的痛
  • 为了研究A题
    • 我们先后学习了
      • 数理方程
      • 数值分析
      • 数值仿真
      • 优化算法
      • 稳定性的理论
      • ......
    • 就是想在2023 年A题大展身手,可惜啊可惜
      • 光学 我的痛
      • 真的很难过 心里一直算算的 感觉对不起朋友
      • 确实是我自己不行
      • 自己不行啊
    • 暑假刚做过手术
    • 暑假手术之前去了一些大学
      • 一个优营也没有拿到,毕竟年龄有点小,基础不扎实
    • 本来计划三年物理系毕业然后转强基计划然后深造的,因为我真的修完了课程。
      • 但是计划有变啊。三年毕竟不够扎实
      • 现在去选了 核与粒子物理 欢迎交流
    • 最后一次参加数学建模是2023UPC 好像是11月第一个周末
      • 加油 
  • 本文主要介绍这几个极其重要的程序设计思路,欢迎大家参考,引用
    • 真的,毕竟百度也是可以引用的嘛
    • 不引用我绝对不会在意的

数值常微分

参考书目

  • 微分方程的数值解法与程序实现  华冬英 李祥贵
  • 量子物理学中的常用算法与程序 井孝功 赵永芳 蒿凤有 
  • 稳定性的理论,方法和应用
  • 微分方程 动力系统与混沌导论

简介

  • 很多同学学习数值分析,都是 高斯消元 牛顿迭代 然后...
    • 譬如我写过的一篇博客

Python牛顿迭代法的应用

追赶法(Thomas) 雅克比迭代(Jacobi) 高斯迭代(Gauss) 的C++实现

  • 其实我不建议这样,为什么呢?
    • 函数零点(非线性方程组的解)的求法非常重要,是现代科学计算的基础性内容,但是,这并不意味着我们必须从这些知识学起,原因有2
      • 1.简单的方法收敛条件严格,具体情况需要具体分析,大概率需要更强的算法
      • 2.已经有封装好的先进方法,不应该在基础方法上浪费时间
        • 包括程序设计的时间
        • 包括程序运行时,因为方法优化不得当导致的计算增加时间
  • 数值常微分方程求解包括下面两类
    • 边值问题的求解(本征值问题的求解)
    • 初值问题的求解
      • 辛算法

边值问题

  • 这个问题非常常见
  • 学习过数学物理方程的同学或者泛函分析的课程对此一定印象深刻
  • 我写过的一些博客有

变分原理与边值问题的计算机处理

计算物理专题:双向打靶法解决本征值问题

计算物理专题:有限差分法解决本征值问题

Numerov算法解一维无限深势阱的问题 (含量子力学导论)

  • 你可以使用matlab Pdetool 辅助求解 这也是非常棒的选择
  • 具体的代码就不放在这里了,因为这个难度比较低,关键是验证的难度很低,图一画就知道算得对不对了,也是暴力求解可以解决的问题,完全没有压力

初值问题

  • 这个问题是最常见的问题 譬如2022 年高教杯A题
  • 如果读者对 动力系统有一定了解的话 这个问题可以做的非常漂亮
  • 我个人认为应当从动力系统学起,这样的话分析解的稳定性就会更完整更合理,而不是放一个试验方程的小招就结束了
  • 初值问题的解法分为两类
    • 隐式解法
    • 显式解法
  • 简单得说,显式解法指的是解的当前步完全由解的前几步决定
  • 而隐式解法指的是
    • 只能得到以当前解为未知数的一个方程,必须求解这个方程才能得到当前解
  • 这也就是为什么我不建议花太多时间在高斯迭代,牛顿迭代上的原因。
    • 对于单个的函数,分析算法的稳定是方便的,但是实际问题中我们更关注的是大型方程组的求解,他们往往是非线性的,耦合的,难以分析的,这时解法的稳定性分析难度会非常得大,不如采取:软件+验证的方法
  • 我写过的相关的一些博客我列在这里,具体的代码我就不反复引用了

Python数值分析案例01--------四阶龙格库塔法解抛体运动

常微分方程的龙格库塔显式与隐式解法

  • 尤其是第二篇文章,非常值得好好阅读,
    • 直接引用相关的方法即可,均经过了实践的检验
    • 包含了一个并行加速的例子,可能需要先学习一下multiprocessing 
  • 提示:每次求解必须有稳定性的分析,没有稳定性的分析,你的解的意义何在?可信度何在?

哈密顿系统的辛算法

  • 这是很出彩的一个地方
  • 如果有同学能在数学建模竞赛中实现这一点,我想是极其棒的一件事情,而且我从未见过有很好的论文在本科生竞赛中实现这一点,这是很不现代的
  • 在这里我就不赘述他的优点在什么地方了,较为复杂,公式也很多,
    • 但是只说一句话吧,这个方法算得出彩,就行了
  • 这是我写的一篇博客,可以看看,这非常的基础,你需要很好阅读参考书才能很好得应用他

自洽可分的哈密顿系统的辛算法

参考文献

  • 量子系统的辛算法 丁培柱

数值积分

  • 数值积分常常在数学建模竞赛的某一处出现,还是非常重要的

蒙特卡洛积分方法

  • 蒙特卡洛积分处理高维积分的效果会更优秀一点,在我很近的一篇文章中提到了对比,但只是很粗略的一笔蒙特卡洛方法的数学基础-1
  • 所以如果只是处于装一下的需要的话,完全没有必要写上去

近似积分方法

  • 大家常用的 矩形近似法 梯形近似法 辛普森近似 都属于这一类
  • 我想,如果是已知了具体函数形式的话,使用外推法会更好一些

计算物理专题:高维Romberg数值积分方法

  • 但很多时候,我们只有每个点的函数值,那么还是使用辛普森方法或者更高阶的方法要好

中心差分式

  • 中心差分式是大家都很熟悉的东西了
  • 我需要提到的一点是,你选取的方法的精度尽量要高一些,譬如
    • 目标是 二阶近似
    • 某一步需要用到中心差分值的方法是四阶近似的
    • 那么你的中心差分式精度的选择应该不低于四阶才好

数值偏微分

  • 这也是常考的问题
  • 但是数值偏微分方程的求解极其得复杂,稳定性特别难以分析,我举一个 用迎风法求解抛物型方程的例子
import numpy as np
import matplotlib.pyplot as plt#\frac{\partial u}{\partial t} = \lambda(
#\frac{\partial^2 u}{\partial x^2} +
#\frac{\partial^2 u}{\partial y^2}
#) + q_vclass projequation2D():def __init__(self, Lambda=1, qv = lambda t, x, y:0,X_start=0, X_end=1,Y_start=0, Y_end=1,T_start=0, T_end=1,dx = 0.05,dy = 0.05,dt = 0.01):#c = lambda x,y,t:(?)self.Lambda = Lambdaself.qv = qvself.dx = dxself.dy = dyself.dt = dtself.X_start = X_startself.Y_start = Y_startself.T_start = T_startself.X_end = X_endself.Y_end = Y_endself.T_end = T_endself.X = np.arange(X_start, X_end, dx)self.Y = np.arange(Y_start, Y_end, dy)self.T = np.arange(T_start, T_end, dt)self.results = np.zeros((len(self.T), len(self.X), len(self.Y)))self.startresults()def initcondition_0(self):X_num = len(self.X)Y_num = len(self.Y)test_fun = lambda x,y: np.sin(5*x)*np.cos(5*y)for ix in range(X_num):for iy in range(Y_num):self.results[0][ix][iy] == test_fun(self.X[ix], self.Y[iy])def boundarycondition_left(self):Y_num = len(self.Y)T_num = len(self.T)for it in range(T_num):for iy in range(Y_num):self.results[it][0][iy] = 25def boundarycondition_right(self): Y_num = len(self.Y)T_num = len(self.T)for it in range(T_num):for iy in range(Y_num):self.results[it][-1][iy] = 25def boundarycondition_up(self):X_num = len(self.X)T_num = len(self.T)for it in range(T_num):for iy in range(X_num):self.results[it][iy][-1] = 25def boundarycondition_down(self):X_num = len(self.X)T_num = len(self.T)for it in range(T_num):for iy in range(X_num):self.results[it][iy][0] = 25def startresults(self):self.initcondition_0()self.boundarycondition_left()self.boundarycondition_right()self.boundarycondition_up()self.boundarycondition_down()def Upwind3P(self):for Ti in range(1, len(self.T)):for Xi in range(1, len(self.X)-1):for Yi in range(1, len(self.Y)-1):rx = self.Lambda * self.dt/(self.dx)**2ry = self.Lambda * self.dt/(self.dy)**2self.results[Ti][Xi][Yi] = \rx * (self.results[Ti-1][Xi-1][Yi]+self.results[Ti-1][Xi+1][Yi])+\2* (1-rx-ry) *self.results[Ti-1][Xi][Yi]+\ry * (self.results[Ti-1][Xi][Yi-1]+self.results[Ti-1][Xi][Yi+1])-\self.results[Ti-2][Xi][Yi]return self.resultsdef show_wave(self):fig = plt.figure(figsize=(8,8))ax1 = fig.add_subplot(111, projection='3d')x, y = np.meshgrid(self.X, self.Y)for time in range(len(self.T)):ax1.plot_surface(x, y, self.results[time, :, :],rstride=2, cstride=2, cmap='rainbow')plt.title("time:" + str(self.T[time]))plt.pause(0.5)plt.cla()c = projequation2D()
u = c.Upwind3P()
c.show_wave()
  • 再来一个解波动方程的例子

import numpy as np
import matplotlib.pyplot as plt#\frac{\partial^2 u}{\partial t^2} = c^2 (
#\frac{\partial^2 u}{\partial x^2} +
#\frac{\partial^2 u}{\partial y^2}
#)class waveequation2D():def __init__(self, c,X_start=0, X_end=1,Y_start=0, Y_end=1,T_start=0, T_end=1.01,dx = 0.01,dy = 0.01,dt = 0.01):#c = lambda x,y,t:(?)self.c = cself.dx = dxself.dy = dyself.dt = dtself.X_start = X_startself.Y_start = Y_startself.T_start = T_startself.X_end = X_endself.Y_end = Y_endself.T_end = T_endself.X = np.arange(X_start, X_end, dx)self.Y = np.arange(Y_start, Y_end, dy)self.T = np.arange(T_start, T_end, dt)self.results = np.zeros((len(self.T), len(self.X), len(self.Y)))self.startresults()def initcondition_0(self, x, y):return np.sin(10*x)def initcondition_1(self, x, y):return np.sin(10*x)def boundarycondition_left(self, t, x, y):return (np.sin(10*y))[0]def boundarycondition_right(self, t, x, y): return (np.sin(10*y))[0]def boundarycondition_up(self, t, x, y):return (np.sin(10*x))[0]def boundarycondition_down(self, t, x, y):return (np.sin(10*x))[0]def startresults(self):x, y = np.meshgrid(self.X, self.Y)self.results[0] = self.initcondition_0(x, y)self.results[1] = self.initcondition_1(x, y)t, x, y = np.meshgrid(self.T, self.X, self.Y)self.results[:, 0, :]  = self.boundarycondition_left(t, self.X_start, y)self.results[:, -1, :] = self.boundarycondition_right(t, self.X_end, y)self.results[:, :, -1] = self.boundarycondition_up(t, x, self.Y_end)self.results[:, :, 0]  = self.boundarycondition_down(t, x, self.Y_start)def test_stability(self, x, y, t):test = 4*self.dt**2*self.c(x, y, t)**2/(self.dx**2 + self.dy**2)if test<=1:return Trueelse:print("unstable in x:", x, "y:", y, "t:", t)return Falsedef Upwind3P(self):for Ti in range(2, len(self.T)):for Xi in range(1, len(self.X)-1):for Yi in range(1, len(self.Y)-1):rx = self.c(self.X[Xi], self.Y[Yi], self.T[Ti])**2 * self.dt**2/self.dx**2ry = self.c(self.X[Xi], self.Y[Yi], self.T[Ti])**2 * self.dt**2/self.dy**2self.results[Ti][Xi][Yi] = \rx * (self.results[Ti-1][Xi-1][Yi]+self.results[Ti-1][Xi+1][Yi])+\2* (1-rx-ry) *self.results[Ti-1][Xi][Yi]+\ry * (self.results[Ti-1][Xi][Yi-1]+self.results[Ti-1][Xi][Yi+1])-\self.results[Ti-2][Xi][Yi]
##                    self.test_stability(self.X[Xi],self.Y[Yi],self.T[Ti])                    return self.resultsdef show_wave(self):fig = plt.figure(figsize=(8,12))ax1 = fig.add_subplot(121, projection='3d')ax2 = fig.add_subplot(122, projection='3d')x, y = np.meshgrid(self.X, self.Y)for time in range(len(self.T)):ax1.plot_surface(x, y, self.results[time, :, :],rstride=2, cstride=2, cmap='rainbow')ax2.plot_wireframe(x, y, self.results[time, :, :],rstride=2, cstride=2, linewidth=1, cmap='rainbow')plt.title("time:" + str(self.T[time]))plt.pause(0.01)plt.cla()def test_fun(x, y, t):return 1c = waveequation2D(c=test_fun)
u = c.Upwind3P()
c.show_wave()

  • 所以一般建议使用Matlab 中的pdetool 求解
  • 这是我写的两篇博客,可以参考

典型的偏微分方程数值解法

二维Poisson方程五点差分格式与Python实现

  • 一定要仔细阅读有关书籍,否则很难做出比较好的成果

参考书目

  • 偏微分方程的数值解法(第三版) 陆金甫
  • 特殊函数概论 王竹溪
  • 数学物理方法与仿真(第三版) 杨华军
  • 科学计算中的偏微分方程有限差分法  张文生

优化算法

  • 这是是数学建模的核心,优化求解
  • 一般而言,很多问题可以做凸优化
    • 但是,数学建模中的优化问题往往不能...
    • 所以,要么二分法全局搜索,要么智能求解吧
  • 最近会写一些相关的博客,就不具体演示了。也可以去我的博客下面找......

  • 写完博客,心情舒畅不少

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83786.shtml

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

相关文章

面试官:说说Vue 3.0中Treeshaking特性?举例说明一下?

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、是什么 二、如何做 Vue2 项目 Vue3 项目 三、作用 一、是什么 Tree shaking 是一种通过清除多余代码方式来…

974. 和可被 K 整除的子数组

974. 和可被 K 整除的子数组 C代码&#xff1a;哈希表前缀和 typedef struct{int val;int cnt;UT_hash_handle hh; } HashTable;int subarraysDivByK(int* nums, int numsSize, int k){HashTable* head NULL;HashTable* out NULL;int sum 0;int cnt 0;out (HashTable*)ma…

Nginx 的优化思路有哪些?网站的防盗链如何做?附图文说明和完整代码步骤

Nginx 的优化思路有哪些?网站的防盗链如何做?实际工作中有哪些类似的安全经验?通过代码实践一步一步实现,附图文说明和完整代码步骤 实验拓扑图: 实验步骤 1、在Centos01上安装Nginx,设置网站根目录/www使用域名www.huhu.com访问 2、在Centos02上安装DNS使用域名访问Ce…

嵌入式Linux--进程间通讯--消息队列

1.需要知道的问题&#xff1a; 1、如何创建消息队列&#xff08;A\B使用同一个队列通信&#xff09; 2、如何加消息到队列&#xff08;队列是链表&#xff09; 3、如何从队列拿到消息 消息队列&#xff1a; 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个…

C#不通过byte[],直接对内存映射文件复制内存

背景 多个进程直接需要传递大量图片&#xff0c;所以对性能要求较高。支付复制内存显然比转成byte[]再复制优越。 命名空间 using System; using System.Diagnostics; using System.Runtime.InteropServices; 代码 public CMainTestForm() { InitializeCo…

【数据结构】二叉树的前序遍历(七)

题目&#xff1a;二叉树的前序遍历 题目详情&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历&#xff1b; 我们先来看几个示例&#xff1a; 输入&#xff1a;root [ 1&#xff0c;null&#xff0c;2&#xff0c;3 ] 输出&#xff1a;[ 1&#xf…

爬虫 — Js 逆向案例二微信公众平台登录

目标网站&#xff1a;https://mp.weixin.qq.com/ 需求&#xff1a;找到密码加密的过程&#xff0c;进行加密 案例分析 1、抓到向服务器发请求的数据包&#xff0c;输入错误的账号和密码 2、找到加密字段 pwd 如果 Search 里面数据太多&#xff0c;也可以在 Initiator 里面查找…

LVS+Haproxy

LVSHaproxy 一、Haproxy简介1.1、Haproxy应用分析1.2、Haproxy的特性1.3、常见负载均衡策略1.4、LVS、Haproxy、Nginx区别1.5、 Haproxy的优点1.6、常见的Web集群调度器 二、Haproxy部署实例四、日志定义优化 一、Haproxy简介 Haproxy 是一个使用C语言编写的自由及开放源代码软…

vue项目搭建

一、vue项目搭建&#xff08;如遇问题依据不同情况动态解决搭建过程中的问题&#xff09; VUE官网链接:https://cli.vuejs.org/. node.js下载链接: https://nodejs.cn/download/ 在PATH中配置node的环境变量&#xff0c;node自带npm和npx C:\workSpace>node -v v18.17.0 C…

OpenResty使用漏桶算法实现限流

前言 其它项目组需要调用接口&#xff0c;添加接口限流&#xff0c;防止项目被狂掉宕机。生产用了openresty&#xff0c;所以在openresty上添加按接口限流&#xff0c;同时&#xff0c;需按照不同接口有不同的限流规则&#xff0c;使用openresty中内置的漏桶算法方式限流。 漏…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】

目录标题 参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计 多目标检测问题滑动窗口&#xff08;Sliding Window&#xff09;滑动窗口缺点 AdaBoost&#xff08;Adaptive Boosting&#xff09;参考 区域建议 selective search 思想慢…

Spring Cloud Eureka:服务注册与发现

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Spring Cloud Eureka&#xff1a;服务注册与发现 Spring Cloud Eureka是Spring Cloud生态系统中的一个组件&#xff0c;它是用于实现服务注册与发现的服务治理组件。在…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

Leetcode算法入门与数组丨5. 数组二分查找

文章目录 1 二分查找算法2 二分查找细节3 二分查找两种思路3.1 直接法3.2 排除法 1 二分查找算法 二分查找算法是一种常用的查找算法&#xff0c;也被称为折半查找算法。它适用于有序数组的查找&#xff0c;并通过将待查找区间不断缩小一半的方式来快速定位目标值。 算法思想…

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据 1.1 栅格数据 栅格图是一个规则的阵列&#xff0c;包含着一定数量的像元或者栅格 常用的栅格图格式有&#xff1a;tif&#xff0c;png&#xff0c;jpeg/jpg等 1.2 矢量数据 矢量图是由一组描述点、线、面&#xff0c;以及它们的色彩、位置的数据&#x…

堆内存与栈内存

文章目录 1. 栈内存2. 堆内存3. 区别和联系参考资料 1. 栈内存 栈内存是为线程留出的临时空间 每个线程都有一个固定大小的栈空间&#xff0c;而且栈空间存储的数据只能由当前线程访问&#xff0c;所以它是线程安全的。栈空间的分配和回收是由系统来做的&#xff0c;我们不需…

如何玩转CSDN AI工具集

前言 人工智能生成内容&#xff08;AIGC&#xff09;是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容&#xff0c;完成文章翻译、代码生成、AI对话、插图创作等工作&#xff0c;带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…

「大数据-0」虚拟机VMware安装、配置、使用、创建虚拟机集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

pip pip3安装库时都指向python2的库

当在python3的环境下使用pip3安装库时&#xff0c;发现居然都指向了python2的库 pip -V pip3 -V安装命令更改为&#xff1a; python3 -m pip install <package>