在python中使用matplotlib绘制欧拉近似和解析近似,产生意外输出

fiei3ece  于 2023-03-19  发布在  Python
关注(0)|答案(1)|浏览(145)

我试图画出微分方程dy/dx = x + y/5的欧拉近似和解析解,其中y(0)= -3

import math
import matplotlib.pyplot as plt

def euler_method(step_size):
   first_x = 0
   last_x = 5
   h = step_size
   n = int((last_x-first_x) / h)
   x=0
   y=-3

   dy = lambda x,y: x + (y/5)
   f = lambda x,y: math.exp(x+(y/5))

   x_values = []
   euler_values= []
   analytical_values = []

   for i in range(1, n+1):
    x_values.append(x)
    euler_values.append(y)
    analytical_values.append(f(x,y))
    y = y + dy(x, y) * h
    x = x + h
    

   x_values.append(x); euler_values.append(y); analytical_values.append(f(x,y))

   plt.plot(x_values, euler_values, 'ro', x_values, analytical_values)
   plt.legend(['Euler values','Analytical values'])
   plt.show()

euler_method(1)

我的输出如下:

这显然是不正确的,但我不知道为什么会发生这种情况,也不知道我必须做出什么改变来解决这个问题。

gudnpqoy

gudnpqoy1#

Wolfram Alpha为您的问题提供this analytical solution。您的问题在我看来不正确。与Stephen Wolfram的观点不一致。
我更正了你的代码。现在可以正常工作了:

import math
import matplotlib.pyplot as plt

# see https://stackoverflow.com/questions/75751065/plotting-euler-approximation-and-analytical-approximation-using-matplotlib-in-py
# Analytical solution: https://www.wolframalpha.com/input?i=22+e%5E%28x%2F5%29+-+5+%285+%2B+x%29&assumption=%22ClashPrefs%22+-%3E+%7B%22Math%22%7D

def euler_method(step_size):
    first_x = 0
    last_x = 5
    h = step_size
    n = int((last_x - first_x) / h)
    x = 0
    y = -3

    dy = lambda x, y: x + (y / 5)
    f = lambda x, y: 22.0 * math.exp(x/5.0) - 5.0 * (5.0 + x)

    x_values = []
    euler_values = []
    analytical_values = []

    for i in range(1, n + 1):
        x_values.append(x)
        euler_values.append(y)
        analytical_values.append(f(x, y))
        y = y + dy(x, y) * h
        x = x + h

    x_values.append(x)
    euler_values.append(y)
    analytical_values.append(f(x, y))

    plt.plot(x_values, euler_values, 'ro', x_values, analytical_values)
    plt.legend(['Euler values', 'Analytical values'])
    plt.show()


if __name__ == '__main__':
    euler_method(0.01)

下面是它生成的图:

相关问题