Аппроксимирующая синусоида методом Эйлера в питоне - PullRequest
0 голосов
/ 06 февраля 2019

Привет. Я пытаюсь использовать метод Эйлера в Python для построения волновой функции sin (sin).

Используя следующий алгоритм:

  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

    4g.end

в моем случае я аппроксимирую функцию sin (A), поэтому моя функция является производной от sin (A), которая равна cos (A).

Iмы реализовали это в коде, как показано ниже

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) движется к нулю, но никогда не становится отрицательной.Это должно быть отрицательным, чтобы заставить синусоидальную функцию понижаться.так что это может колебаться.Мои ошибочные результаты приведены здесь: enter image description here

Я, должно быть, делаю что-то действительно глупое, но я не могу понять это.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 февраля 2019

Вы решаете ODE

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

, у которого есть привлекательная стабильная точка на y=pi/2, которую вы достигаете для t=10 для всех графических целей, после чего решение является постоянным.Как вы попали в график.

Вам нужна либо система

x' = -y
y' =  x

, либо через ограниченный интервал

y' = sqrt(1-y^2)

Или в простой интеграции

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