Метод Рунге- Кутте 4-го порядка

Подскажите как тут реализовать данный пример? введите сюда описание изображения

Мой код:

import numpy as np
from matplotlib import pyplot as plt


print("Task 6")


def make_f(b):
    def foo(x, y):
        return 3 / (x ** 2 + y ** 2 + b)

    return foo


def runge(f, x_0, y_0, a, b, h=0.1, cor=False):
    x = x_0
    y = y_0
    n = int((b - a) / h) + 1
    print('Step:', h)
    sol = {}
    for i in range(n):
        K1 = h * f(x, y)
        K2 = h * f(x + h / 2, y + K1 / 2)
        K3 = h * f(x + h / 2, y + K2 / 2)
        K4 = h * f(x + h, y + K3)

        if cor:
            if i == 0:
                theta = abs((K2 - K3) / (K1 - K2))
                print('THETA', theta)
            if theta > 0.033:
                return runge(f, x_0, y_0, a, b, h=h / 2)

        # print(x, y)
        sol[x] = y
        x = x + h
        delta_y = (K1 + 2 * K2 + 2 * K3 + K4) / 6
        y = y + delta_y
    return sol


betan = [1.0, 1.4, 1.8, 2.2, 2.6, 3.0]
a = 0
b = 0.31
h = 0.1
y_0 = 0
x_0 = 0
ys = runge(make_f(betan[1]), x_0, y_0, a, b, h=h)
print(ys)



    # # # xs = np.arange(a, b+h, h)
    # # ys = runge(foo, x_0, y_0, a, b, h=h)
    # # print(ys)
    # # # plt.plot(xs, list(ys.values()))
    # # # ys = runge(foo, x_0, y_0, a, b, h=h, cor=True)
    # # # xs = np.arange(a, b+0.25, 0.25)
    # # # plt.plot(xs, list(ys.values()))
    # # # plt.plot(xs, [solution(i) for i in xs])
    # # # plt.xlabel('x')
    # # # plt.ylabel('y')
    # # # plt.legend(['h=0.5', 'h=0.25', 'Точний'])
    # # # plt.show()

Как можете заметить я пытаюся суммировать разные типы данных.Как решить эту проблему?ПОскольку у меня все в функциях то я в тупике где реализовать тут цикл for


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Сделайте функцию, которая возвращает f:

def make_f(b):

    def foo(x, y):
        return 3/(x**2+y**2+b)
  
    return foo
→ Ссылка