如何在给定 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"。 :) 但是通过微分和边界值的替换来检查它是否正确是相当容易的。