Реализация 3/8 Runge Kutta в Python с ODE 2-го порядка

Я хочу решить уравнение y'' + 5y' + 6y = cos(t). Поскольку это 2-й порядок, я сначала создал систему ОДУ первого порядка, где dy/dt = z = f(t,y,z) и dz/dt = cos(t) - 5z - 6y = g(t,y, я). Я новичок в python и не знаю, как именно реализовать программу с системой ODE, но для входных данных я написал func = [f,g] и ic = [y0,dy0].

Во-вторых, поскольку Рунге Кутта оценивает выражение переменных, значения которых доступны только во время выполнения, я использую функцию eval python, хотя и получаю сообщение об ошибке. Ниже мой код и сообщение об ошибке:

def f(t,y,z): 
    return z
def g(t,y,z): 
    return np.cos(t)-5*z-6*y
t = np.linspace(0,20,100)
y = np.zeros((1,len(t)))
z = np.zeros((1,len(t)))

fun = [f(t,y,z),g(t,y,z)]
ic = [1,0] # y0,dy0

def ruku(fun,h):
    t0=0
    tf=20
    
    t=t0
    y=ic
    fc=0

    while t < tf:
        if t+h > tf:
            exit()
        if h == tf-t:
            exit()
        k1=eval('fun',t,y)
        k2=eval('fun',t+h/3,y+h*k1/3)
        k3=eval('fun',t+2*h/3,y+h*(k2-k1/3))
        k4=eval('fun',t+h,y+h*(k3-k2+k1))
        
        y=y+h*(k1+3*(k2+k3)+k4)/8
        fc=fc+4
        t=t+h
    return y
ruku(fun,0.01)

-->TypeError: globals must be a dict

Спасибо заранее за любые предложения; Я действительно пытаюсь сделать эту работу.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, я недооценивал простоту Python! Заменил мой цикл на:

    while t +h <= tf:
            
        k1=fun(t,y)
        k2=fun(t+h/3,y+h*k1/3)
        k3=fun(t+2*h/3,y+h*(k2-k1/3))
        k4=fun(t+h,y+h*(k3-k2+k1))
        
        y=y+h*(k1+3*(k2+k3)+k4)/8
        fc=fc+4
        t=t+h

и преобразовал мои входы в np.arrays

Другие вопросы по теме

Требуется объяснение сообщения об ошибке «TypeError: Receiver должен быть экземпляром класса»
Solidity: TypeError: невозможно прочитать свойства undefined (чтение «JsonRpcProvider») в простом контракте HelloWorld при попытке протестировать
Ошибка типа OCaml с применением функции
Тип 'int' не является подтипом 'двойного' флаттера даже после использования toInt()
С ошибкой: «отсутствует 1 обязательный позиционный аргумент», хотя я ввожу аргумент
Ошибка «строковые индексы должны быть целыми» при выборе данных об акциях Yahoo Finance с датами «начало» и «конец»
Консоль NextJS регистрирует TypeError на консоли каждый раз, когда я делаю запрос на локальном хосте: не удается прочитать свойства неопределенного (чтение «_owner»)
Как решить lambda() принимает 1 позиционный аргумент, но дано 2
Ошибка машинописного текста: элемент неявно имеет тип «любой», поскольку выражение типа «строка» не может использоваться для индексации
Я получаю TypeError: объект 'int' не является итерируемым, но на самом деле не об ошибке