Улучшенный метод Эйлера - PullRequest
0 голосов
/ 26 апреля 2020

Итак, у меня есть этот код для улучшенного метода Эйлера ниже:

import numpy as np
import matplotlib.pyplot as plt


int = np.array([50, 256])

yt = lambda x: 2*x**4
f = lambda x,t: 4*y/x

x0 = 1.
xf = 3.

for i in range(len(int)):
    x = np.linspace(x0, xf, int[i]+1)
    h = (xf-x0)/int[i]

    y = np.zeros(int[i]+1)
    y[0] = yt(x0)

    for k in range(1, len(y)):
        fk = f(x[k-1], y[k-1])
        fkh = f(x[k], y[k-1]+h* f(x[k-1], y[k-1]))
        y[k] = y[k-1] + (h/2.)*(fk+fkh)

        abserr = np.abs(yt(x) - y)

        plt.semilogy(x,abserr,'*')
        plt.show()


Однако, когда я запускаю его, он выдает мне эту ошибку, которую я не знаю, как исправить. Я искал в Интернете, и я видел, как люди векторизовали это, но я не получил это работать. Любой совет или решение будет принята с благодарностью

TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "noah.py", line 23, in <module>
    y[k] = y[k-1] + (h/2.)*(fk+fkh)
ValueError: setting an array element with a sequence.

1 Ответ

2 голосов
/ 27 апреля 2020

У вас есть опечатка в определении лямбда-функции f. Должно быть

f = lambda x,y: 4*y/x

Из-за опечатки функция возвращала массив длиной 51 и 257, который взят из определения x. Еще одна проблема, которую я обнаружил, было бы лучше, если бы программирование изменило переменную int на что-то вроде int_1. Это потому, что int является частью языка Python.

...