<jupyter_start><jupyter_text>Вычислительный практикум Задание №4 Задача Коши для обыкновенного дифференциального уравнения 1-го порядка. <NAME> 321 группа Вариант №6 $y' = 1 + (0.5 - x)  \sin y - (1 + x) y$$y(0) = 0$<jupyter_code>from math import sin
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

%matplotlib inline
plt.rcParams['figure.dpi'] = 150

def dy(y, x):
  return 1 + (0.5 - x) * sin(y) - (1 + x) * y

def ddy(x):
  return dy(x[1], x[0]) 


y0 = 0<jupyter_output><empty_output><jupyter_text>Решение при помощи встроенных средств<jupyter_code>a, b = 0, 1
h = 0.1
n = int((b - a) / h) + 1
x = np.arange(a, b + h, h)
y = odeint(dy, y0, x) 
y = np.array(y).reshape(n, )
d_y = list(map(ddy, zip(x, y)))
y_math = pd.DataFrame({"x" : x, "y" : y, "y'" : d_y})
y_math
plt.plot(x, y, label="y")
plt.plot(x, d_y, label="y'")
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title("Графики y и y', построенные встроенными методами")
plt.show()<jupyter_output><empty_output><jupyter_text>Решение методом Эйлера с шагом $h$<jupyter_code>def euler(h):

  x_h = [0]
  y_h = [y0]
  y = y0
  n = int((b - a) / h) + 1
  for i in range(1, n):
    x = a + h * i
    y = y + h * dy(y, x)
    x_h.append(x)
    y_h.append(y)

  return pd.DataFrame({'x': x_h, 'y': y_h})

y_h = euler(h)
y_h<jupyter_output><empty_output><jupyter_text>Решение методом Эйлера с шагом $\frac{h}{2}$<jupyter_code>y_h2 = euler(h/2)
y_h2
R_m = (np.array(y_h2['y'][::2]) - np.array(y_h['y'])) / (2**1 - 1)
y_rev = np.array(y_h2['y'][::2]) + R_m
y_rev = pd.DataFrame({'x': y_h['x'], 'y' : y_rev})
y_rev<jupyter_output><empty_output><jupyter_text>Сравнительная таблица<jupyter_code>pd.DataFrame({'x': y_math['x'],
              'y_math': y_math['y'],
              'y_h': y_h['y'],
              'y_h2': np.array(y_h2['y'][::2]),
              'y_rev': y_rev['y'],
              'y_rev - y_math': y_rev['y'] - y_math['y']})
x = y_math['x']
plt.plot(x, y_math['y'], label="y_math")
plt.plot(x, y_h['y'], label="y_h")
plt.plot(x, np.array(y_h2['y'][::2]), label="y_h2")
plt.plot(x, y_rev['y'], label="y_rev")
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title("Сравнительный график")
plt.show()<jupyter_output><empty_output><jupyter_text>Метод Рунге-Кутты четвертого порядка<jupyter_code>x_h = [0]
y_h = [y0]
y = y0
x = a
h = 0.1
n = int((b - a) / h) + 1
for i in range(1, n):
  k1 = h * dy(y, x)
  k2 = h * dy(y + k1/2, x + h/2)
  k3 = h * dy(y + k2/2, x + h/2)
  k4 = h * dy(y + k3, x + h)
  x += h
  y += 1/6 * (k1 + 2 * k2 + 2 * k3 + k4)
  x_h.append(x)
  y_h.append(y)

y_RK = pd.DataFrame({'x': x_h, 'y': y_h})
y_RK<jupyter_output><empty_output><jupyter_text>Экстраполяционный метод Адамса 4-го порядка<jupyter_code># начало таблицы возьмем из метода Рунге-Кутты
y_Ad_ex = y_RK.copy()
y = y_Ad_ex['y'][4]
for i in range(4, n):
  y = y + 1 / 720 * h * ( 1901 * dy(y_Ad_ex['y'][i], y_Ad_ex['x'][i])
                        - 2774 * dy(y_Ad_ex['y'][i-1], y_Ad_ex['x'][i-1])
                        + 2616 * dy(y_Ad_ex['y'][i-2], y_Ad_ex['x'][i-2])
                        - 1274 * dy(y_Ad_ex['y'][i-3], y_Ad_ex['x'][i-3])
                        + 251  * dy(y_Ad_ex['y'][i-4], y_Ad_ex['x'][i-4]))
  y_Ad_ex['y'][i + 1] = y

y_Ad_ex<jupyter_output><empty_output><jupyter_text>Итерполяционный метод Адамса 4-го порядка<jupyter_code># начало таблицы возьмем из метода Рунге-Кутты
y_Ad_in = y_Ad_ex.copy()
y = y_Ad_ex['y'][3]
for i in range(3, n-1):
  y = y + 1 / 720 * h * ( 251 * dy(y_Ad_in['y'][i + 1], y_Ad_in['x'][i + 1])
                        + 646 * dy(y_Ad_in['y'][i], y_Ad_in['x'][i])
                        - 264 * dy(y_Ad_in['y'][i-1], y_Ad_in['x'][i-1])
                        + 106 * dy(y_Ad_in['y'][i-2], y_Ad_in['x'][i-2])
                        - 19  * dy(y_Ad_in['y'][i-3], y_Ad_in['x'][i-3]))
  y_Ad_in['y'][i + 1] = y

y_Ad_in<jupyter_output><empty_output><jupyter_text>Сравнительная таблица<jupyter_code>pd.DataFrame({'x': y_math['x'],
              'y_math': y_math['y'],
              'y_math - y_RK': y_math['y'] - y_RK['y'],
              'y_math - y_Ad_ex': y_math['y'] - y_Ad_ex['y'],
              'y_math - y_Ad_in': y_math['y'] - y_Ad_in['y'],
              })<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.21319199057714958, 'fraction_numerical': 0.0336866902237927, 'mean_word_length': 3.146484375, 'pattern_counts': {'":': 0, '<': 38, '<?xml version=': 0, '>': 38, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '79595', 'license': 'MIT', 'n_tokens_mistral': 2175, 'n_tokens_neox': 2180, 'n_words': 385, 'path': 'lab_4.ipynb', 'repo_name': 'Qvery-mm/NumericMethods_2', 'size': '4260'}