如何在给定 f'(x) 的情况下使用欧拉方法逐步逼近 f(x)
How to stepwise approximate f(x) using Euler's method given f'(x)
这是俄亥俄州立大学在线微积分课程的一道题。很简单,但是这个老家伙想写一个 Python 程序而不是手动解决它。用头撞墙:
f′(x)=−0.5x^2 − 0.5f(x) 满足
f(−3)=0.
使用重复线性逼近(也称为欧拉方法)来逼近此函数在 x=−1 处的值
使用 1/2 的步长
def fprime(a):
return -.5*(a**2) - .5*f(a)
h = .5
f(-3) = 0
# So f'(-3) = -.5*(-3)^2 - .5*(0) = -4.5
# And since f(a+h) = f(a) + h*f'(a):
# f(-3 + .5) = f(-3) + .5*(-4.5) = -2.25 which leads to:
# f'(-2.5) = see fprime above . . . .
# repeat steps to solve for f(-1)
如何在不引用自身的情况下定义 f(a) 然后构造循环?
我很少尝试编程,希望我有时间和头脑去真正学习如何编程。感谢您的耐心等待。
诀窍是更改 fprime
的定义,使其接受 y
参数,这样您就可以将在 Euler 积分中计算的 y
值传递给它功能。
def euler(df, x0, y0, dx, x1):
x, y = x0, y0
while x < x1:
y = y + dx * df(x, y)
x += dx
return y
def fprime(x, y):
return -0.5 * (x**2) - 0.5 * y
x0 = -3.0
y0 = 0.0
x1 = -1.0
for h in (0.5, 0.05, 0.001, 1E-6):
print euler(fprime, x0, y0, h, x1)
输出
-3.140625
-2.36751792506
-2.33223301294
-2.33149760872
如您所见,使用 h
= 0.5 计算的值不是很准确。较小的 h
提供更好的值,但执行一百万步有点慢。 :) 欧拉积分很简单,但不是很快或不准确:还有更好的方法。
FWIW,这是我使用第 3 方 mpmath 任意精度数学模块计算的更准确的值:
-2.3314962060281726737298106653176348
解析解如下:
f(x) = -x² + 4x - 8 + 29 exp(-(x+3)/2)
或在Python
f = lambda x: -x**2 + 4*x - 8 + 29 * exp(-0.5*(x+3))
我将微积分的详细信息保留为 "an exercise for the reader"。 :) 但是通过微分和边界值的替换来检查它是否正确是相当容易的。
这是俄亥俄州立大学在线微积分课程的一道题。很简单,但是这个老家伙想写一个 Python 程序而不是手动解决它。用头撞墙:
f′(x)=−0.5x^2 − 0.5f(x) 满足
f(−3)=0.
使用重复线性逼近(也称为欧拉方法)来逼近此函数在 x=−1 处的值
使用 1/2 的步长
def fprime(a):
return -.5*(a**2) - .5*f(a)
h = .5
f(-3) = 0
# So f'(-3) = -.5*(-3)^2 - .5*(0) = -4.5
# And since f(a+h) = f(a) + h*f'(a):
# f(-3 + .5) = f(-3) + .5*(-4.5) = -2.25 which leads to:
# f'(-2.5) = see fprime above . . . .
# repeat steps to solve for f(-1)
如何在不引用自身的情况下定义 f(a) 然后构造循环? 我很少尝试编程,希望我有时间和头脑去真正学习如何编程。感谢您的耐心等待。
诀窍是更改 fprime
的定义,使其接受 y
参数,这样您就可以将在 Euler 积分中计算的 y
值传递给它功能。
def euler(df, x0, y0, dx, x1):
x, y = x0, y0
while x < x1:
y = y + dx * df(x, y)
x += dx
return y
def fprime(x, y):
return -0.5 * (x**2) - 0.5 * y
x0 = -3.0
y0 = 0.0
x1 = -1.0
for h in (0.5, 0.05, 0.001, 1E-6):
print euler(fprime, x0, y0, h, x1)
输出
-3.140625
-2.36751792506
-2.33223301294
-2.33149760872
如您所见,使用 h
= 0.5 计算的值不是很准确。较小的 h
提供更好的值,但执行一百万步有点慢。 :) 欧拉积分很简单,但不是很快或不准确:还有更好的方法。
FWIW,这是我使用第 3 方 mpmath 任意精度数学模块计算的更准确的值:
-2.3314962060281726737298106653176348
解析解如下:
f(x) = -x² + 4x - 8 + 29 exp(-(x+3)/2)
或在Python
f = lambda x: -x**2 + 4*x - 8 + 29 * exp(-0.5*(x+3))
我将微积分的详细信息保留为 "an exercise for the reader"。 :) 但是通过微分和边界值的替换来检查它是否正确是相当容易的。