在python中用欧拉法逼近正弦波

Approximating Sin wave with euler method in python

您好,我正在尝试使用 python 中的欧拉方法来绘制正弦波函数 sin(A)。

使用以下算法:

  1. 定义 f(t,y)

  2. 输入 t0 和 y0 .

  3. 输入步长 h 和步数 n .
  4. 对于 j 从 1 到 n 做:

    4a。 m=f(t0,y0)

    4b。 y1=y0+h∗m

    4c。 t1=t0+h

    4d。打印 t1 和 y1

    4e。 t0=t1

    4f。 y0=y1

    4克。结束

在我的例子中,我正在逼近函数 sin(A),所以我的函数是 sin(A) 的导数,即 cos(A)。

我已经在下面的代码中实现了它

def dSindt(A): 
    dSindt = cos(A) ;
    return dSindt; 



%matplotlib inline
import matplotlib.pyplot as plt

A0 = 0 
t0 = 0; 
tf = 3600
del_t = .1; 
num_steps = int((tf - t0)/del_t); 
A_mesh = [0]*(num_steps + 1);
time_mesh = [0]*(num_steps + 1); 

A_mesh[0] = A0;
time_mesh[0] = t0;

for i in range(num_steps):
    A_mesh[i+1] = A_mesh[i] + dTindt(A_mesh[i])*del_t 
    time_mesh[i+1] = time_mesh[i] + del_t; 

plt.plot(time_mesh,A_mesh,color='b');
plt.title('Approx. Sin Wave');
plt.xlabel('Time (min)');
plt.ylabel('A')

似乎无论我对步长做什么,导数 cos(A) 都会趋向于零,但永远不会为负。它必须是负的才能使正弦波函数下降。所以它可以振荡。我的错误结果是这里的图片:

我一定是在做一些非常愚蠢的事情,但我想不通。

感谢任何帮助。

您正在求解 ODE

y'(t) = cos(y(t))

y=pi/2 处有一个吸引人的稳定点,您可以达到 t=10 用于所有图形目的,之后解是常数。正如您在图表中所看到的那样。

您需要一个系统

x' = -y
y' =  x

或在有限的时间间隔内

y' = sqrt(1-y^2)

或者在一个简单的集成中

y'(t) = cos(t).