python - 使用 Numpy 的中心差异算法
问题描述
我正在尝试使用 Numpy 实现一个相当简单的算法来数值求解微分方程组。我使用所谓的欧拉前向方法很好地工作(即解决方案是预期的指数衰减),但它使用中心差异方案产生有趣的结果(参见下图中的红色和绿色曲线,与橙色和蓝色相比) .
我怀疑这可能与 Numpy(以及更普遍的 Python)处理分配的方式有关(是否只是一个名称,是否通过引用过去,是否np.copy()
应该使用切片表示法或 a 等)。老实说,我已经阅读了几篇关于这个主题的文章,但它仍然让我感到困惑(我是 Fortran 的新手)。
我正在使用并重现上图的代码的简化版本如下。
import numpy as np
import matplotlib.pyplot as plt
N = 100
Dt = 10 / N
t = np.linspace(0, 10, N+1)
y1 = np.zeros(N+1)
y2 = np.zeros(N+1)
##########################################
# problem definition (the result is an exponential decay)
y1[0] = 1
y2[0] = 2
def f(y):
return -0.1 * y
##########################################
fig, ax = plt.subplots()
##########################################
# Euler-forward
y = np.ones(2)
y[0] = y1[0]
y[1] = y2[0]
for i in range(1, N+1):
y = y + f(y) * Dt
y1[i] = y[0]
y2[i] = y[1]
ax.plot(t, y1)
ax.plot(t, y2)
##########################################
##########################################
# central differences
y = np.ones(2)
y[0] = y1[0]
y[1] = y2[0]
# first step is Euler-forward
y_new = y + f(y) * Dt
y_old = y
y = y_new
y1[1] = y[0]
y2[1] = y[1]
for i in range(2, N):
f = np.cos(y)
y_new = y_old + 2 * f * Dt
y_old = y
y = y_new
y1[i] = y[0]
y2[i] = y[1]
ax.plot(t, y1)
ax.plot(t, y2)
##########################################
解决方案
推荐阅读
- c++ - C++ 中全图的优化(内存)实现
- ubuntu - 如何修复 INET 错误“无法加载库”
- jquery - 如何在 CakePHP 4 中正确使用 AJAX/JQuery/JSON?
- java - Selenium:javascript注入后回调Java方法
- node.js - 从 S3 上传和显示图像
- python - 将精灵添加到不与组中的任何精灵发生冲突的组中
- ocaml - 具有循环函数依赖性的递归匹配函数
- php - 通过 php 获取从第一个链接产生的新链接
- internationalization - 部署 Nextjs 应用程序后,vercel 上的 ERR_TOO_MANY_REDIRECTS
- regex - 正则表达式中的一些单词异常