- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于数值微分方程问题的算法,称为欧拉法。本质上,欧拉方法近似于微分方程的解。我的函数适用于单步大小(值 h
),但我试图更改代码以允许我循环 3 个不同的值 h(通过将 h
从单个值更改为可能值列表) .但是,我编写的函数没有充分循环我的值。我是 python 新手,以前使用过 R。有人可以告诉我如何正确地做到这一点。
我的适用于步长 h 的单个值的代码是:
from math import exp # exponential function
dy = lambda x,y: x*y
f = lambda x: exp(x**2/2) # analytical solution function
x = 0 # Intial value X_0
xn = 2 # Final Value
y = 1 # value of y(x0)
h = 0.2 # stepsize
n = int((xn-x)/h)
print ('x \t\t y (Euler h={}) \t y (analytical)'.format(h))
print ('%f \t %f \t %f'% (x,y,f(x)))
for i in range(n):
y += dy(x, y)*h
x += h
print ('%f \t %f \t %f'% (x,y,f(x)))
x y (Euler h=0.5) y (analytical)
0.000000 1.000000 1.000000
0.500000 1.000000 1.133148
1.000000 1.250000 1.648721
1.500000 1.875000 3.080217
2.000000 3.281250 7.389056
h=[0.01,0.2,0.5]
并具有值以创建显示解析解和欧拉方法解在不同步长值下的图。
# Improved to allow plotting different values
import matplotlib.pyplot as plt
import numpy as np
from math import exp # exponential function
dy = lambda x,y: x*y
f = lambda x: exp(x**2/2) # analytical solution function
x = 0
xn = 2
y = 1
# Container for step sizes
h = [0.5,0.2,0.1]
# Container to store the x values at each stepsize
# X =np.zeros((3,))
print ('x \t\t y (Euler) \t y (analytical)')
print ('%f \t %f \t %f'% (x,y,f(x)))
for j in range(0,len(h),1):
n = int((xn-x)/h[j])
for i in range(n):
y += dy(x, y)*h[j]
x += h[j]
print ('%f \t %f \t %f'% (x,y,f(x)))
plt.plot(x,y)
plt.show()
x y (Euler) y (analytical)
0.000000 1.000000 1.000000
0.500000 1.000000 1.133148
1.000000 1.250000 1.648721
1.500000 1.875000 3.080217
2.000000 3.281250 7.389056
最佳答案
您犯了一个小错误,如果要绘制结果,则需要将结果存储在容器中。我稍微重写了你的代码。在讨论您的代码有什么问题之前,我首先给您完整的代码。也许你自己发现了错误。我还添加了解析解的计算和其他一些你喜欢的小改进。所以这里是代码:
import matplotlib.pyplot as plt
import numpy as np
from math import exp # exponential function
dy = lambda x, y: x * y
f = lambda x: exp(x ** 2 / 2) # analytical solution function
x_final = 2
# analytical solution
x_a = np.arange(0, x_final, 0.01)
y_a = np.zeros(len(x_a))
for i in range(len(x_a)):
y_a[i] = f(x_a[i])
plt.plot(x_a, y_a, label="analytical")
# Container for step sizes
h = [0.5, 0.2, 0.1]
for j in range(len(h)):
x = 0
y = 1
print("h = " + str(h[j]))
print("x \t\t y (Euler) \t y (analytical)")
print("%f \t %f \t %f" % (x, y, f(x)))
n = int((x_final - x) / h[j])
x_n = np.zeros(n + 1)
y_n = np.zeros(n + 1)
x_n[0] = x
y_n[0] = y
for i in range(n):
y += dy(x, y) * h[j]
x += h[j]
print("%f \t %f \t %f" % (x, y, f(x)))
x_n[i + 1] = x
y_n[i + 1] = y
plt.plot(x_n, y_n, "x-", label="h=" + str(h[j]))
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
xn
至
x_final
以避免名称与我介绍的变量混淆。如前所述,您需要将每个 x 和 y 值存储在容器中。我为此使用了 NumPy 数组,但您也可以使用列表。这
n = int((x_final - x) / h[j])
x_n = np.zeros(n + 1)
y_n = np.zeros(n + 1)
x_n[0] = x
y_n[0] = y
h
的循环内由于子步数
n
每个 h 都不同。
i
末尾-loop,我只写当前的
x
和
y
值到数组中的正确位置。
for i in range(n):
y += dy(x, y) * h[j]
x += h[j]
print("%f \t %f \t %f" % (x, y, f(x)))
x_n[i + 1] = x
y_n[i + 1] = y
plt.plot
与
x
和
y
,因为它们是 sclar,所以只绘制一个点,您需要将数组传递给函数:
plt.plot(x_n, y_n, "x-", label="h=" + str(h[j]))
"x-"
.
i
仅对第一个
h
执行循环是你没有重置
x
和
y
到它们的初始值。所以你的
n
一直是
0
在第一次运行外循环之后。
for h in h_list:
...
h[j]
更具可读性。而不仅仅是
h
,但我认为现在这已经足够了。 ;)
关于python - 不同步长的欧拉方法。如何更改算法的代码以考虑不同的步长值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61421351/
我想计算一个圆上的所有点。我已经知道我可以使用 x = r * cos(theta) + x0, y = r * sin(theta) + y0 来计算点 - 但是我想知道是否有是根据我的像素 Can
我正在 pyqt 中构建一个工具,它有一个 slider 可以对几何区域进行排序。在某些情况下,数据的平均值或最小面积值与最大值之间可能存在极大差距。 让它像:面积 = [0.5、1.0、1.3、1.
我使用基本的指数移动平均线对一些数据进行平滑处理 filter : int main () { double a0 = 0.1; double input = 8.0; dou
给定一个整数列表是否存在找到值之间最大距离的默认方法? 所以如果我有这个数组 [1, 3, 5, 9, 15, 30] 值之间的最大步长是 15。列表对象是否有这样做的方法? 最佳答案 不,list
我试图通过每张幻灯片上 10 的幂来更改 slider 步长,但它无法正常工作。我不确定是应该使用 stepUp() 还是直接更改 step 的值。 这就是我如何增加 10 的幂: var incre
我有一个 python 函数,它接受一堆(1 个或 2 个)参数并返回一个二维数组。我一直在尝试使用 scipy curve_fit 和 least_squares 来优化输入参数,以便生成的二维数组
是否可以让 step 忽略 min 属性? 现在,它的步骤如下:2, 7, 12, 17, ... 相反,我希望它是:2, 5, 10, 15, 20, ... 我的真实代码实际上使用了这样的动态值
是否可以在纯css中设置一些宽度变化的步骤? 假设我的 div 宽度为 100%,因此当容器为 30px 时,它的宽度将为 30px。但是是否可以将一些“跳转”设置为 20px,以便当容器为 30px
抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。 要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容: 1. for ( auto & elem
我正在使用 Matlab 求解微分方程。我想强制 ode45 采取恒定步长,因此它在求解方程时总是在 T 轴上递增 0.01。我该怎么做? ode45 始终采取优化的随机步骤,我似乎无法弄清楚如何使其
我是一名优秀的程序员,十分优秀!