@shevzoom
 dev., student at MEPhI

1)Почему отличаются графики? 2)Есть ли функция для записи элемента в массив в цикле?

1 часть вопроса, решил уравнение точным и численным методом, проверил на Wolfram, затем составил и выразил рекуррентное уравнение (замена: y'' на центральную производную), не забыл и про начальные условия. Решения получаются верными, но графики не накладываются друг на друга при увеличении точности N. Почему? Ошибка где-то в коде или с чем?

2 часть вопроса, есть более приятный способ заполнения массивов oX, oY1, oY2? не очень удобно копировать значения из консоли и вставлять в массивы, мб можно воспользоваться какой-нибудь функцией? Как, например, с data frame на R?

import math as m
import matplotlib.pyplot as plt

# y'' + 4y = 4 / sin(2x);    y(pi/4) = 2 ; y'(pi/4) = pi

def f(x):
    # Точное реш.
    return (m.log(m.fabs(m.sin(2*x))) + 2)*m.sin(2*x) + (-2*x)*m.cos(2*x)

def fn(x):
    # неоднородность
    return 4/m.sin(2*x)

N = 100
h = 1/N

i = 0

x = m.pi/4

u:float; u1:float; u0: float
u0 = 2; u1 = m.pi*h + 2

while i < N:
    u2 = fn(x) * pow(h,2) - 2*u1 * (2*pow(h,2) - 1) - u0    # u2 mean U_(n+1) , где в скобках индексы
    x += h                                                  # u1 mean U_n
    i += 1                                                  # u0 mean U_(n-1)
    # print(i,'U(n)=', u2,'y(x)=', f(x))
    # print(u2, ',')
    # print(i * h, ',')
    print(f(x), ',')

# Берем первых 20 знач. из цикла

oX = [0.05 ,
0.1 ,
0.15000000000000002 ,
0.2 ,
0.25 ,
0.30000000000000004 ,
0.35000000000000003 ,
0.4 ,
0.45 ,
0.5 ,
0.55 ,
0.6000000000000001 ,
0.65 ,
0.7000000000000001 ,
0.75 ,
0.8 ,
0.8500000000000001 ,
0.9 ,
0.9500000000000001 ,
1.0 ]

oY1 = [2.302588469032184 ,
2.302638678216189 ,
2.302791857481596 ,
2.303055985047565 ,
2.3034455133160163 ,
2.303983408305429 ,
2.304704752177307 ,
2.30566306162952 ,
2.306941711028906 ,
2.308675727136845 ,
2.311096626208993 ,
2.3146345129193575 ,
2.320185505045508 ,
2.329971810302939 ,
2.3514233698804583 ,
2.4339567980618853 ,
1.9501171129320132 ,
2.2149755290716815 ,
2.248574790313648 ,
2.261656447015457]

oY2 = [2.1518263016746437 ,
2.292202658780094 ,
2.4198801892121797 ,
2.5338482845690637 ,
2.6333593158228834 ,
2.717959345873653 ,
2.787528235206554 ,
2.8423352460034197 ,
2.8831214252566078 ,
2.9112307270818762 ,
2.9288360448728463 ,
2.939368191384773 ,
2.9484422767097875 ,
2.966297428201235 ,
3.0172108006898744 ,
3.214224781823093 ,
3.249866206813253 ,
3.1649321044435164 ,
3.002896533120906 ,
2.7794652898412173]


plt.plot(oX, oY1, color='green', marker='o', linestyle='solid')
plt.plot(oX, oY2, color='red', marker='o', linestyle='solid')

plt.show()
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AstraVlad
Финансист, консультант, программист-любитель
1. Небольшие отличия в значениях могут быть из-за float, в финансовой аналитике, например, я вообще стараюсь его не использовать, потому что даже при операциях с небольшими числами могут вылезать какие-нибудь хвосты из стотысячных, причем совершенно внезапно.
Вот пример и объяснение таких проблем
Но может быть и не в этом дело, конечно, в данном случае.

2. Имеется в виду list.append()? У вас тут не массивы, а списки. Я правильно понял, что нужно сохранять в списке значения, которые получаются в цикле "while i < N:"?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы