Python трапецеидальный метод построения графиков - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь изобразить результат трапецеидального метода на графике, я понял, что для получения точного значения интеграла вы можете использовать integrate.trapz(f(x)) из scypy библиотеки. Это мой второй месяц изучения математической математики, но я еще не совсем уверен в использовании библиотек.

Вот мой код

from scipy import integrate

def f(x):
    return 1 - x - 4*x**3 + 2*x**5

def trapezoid(a, b, n):
    h = (b - a) / n
    s = (f(a) + f(b))

    i = 1
    while i < n:
        s += 2 * f(a + i * h)
        i += 1
        area = ((h / 2) * s)
    return area

def graphTrapezoid():
    val = []
    err = []
    exact_sum = integrate.trapz(f(b))-integrate.trapz(f(a))
    for i in range (2,100):
        val.append(trapezoid(a,b,i))
        errVal = abs((trapezoid(a,b,i) - exact_sum)/exact_sum)
        err.append(errVal)
    plt.plot(val, err)

a = 1
b = 5
n = 1
graphTrapezoid()   

Ниже приведено сообщение об ошибке, которое я получил

IndexError                                Traceback (most recent call last)
<ipython-input-134-504c0acc46bf> in <module>
     39 
     40 
---> 41 graphTrapezoid()

<ipython-input-134-504c0acc46bf> in graphTrapezoid()
     29     val = []
     30     err = []
---> 31     exact_sum = integrate.trapz(f(b))-integrate.trapz(f(a))
     32     for i in range (2,100):
     33         val.append(trapezoid(a,b,i))

~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in trapz(y, x, dx, axis)
   4059     slice1 = [slice(None)]*nd
   4060     slice2 = [slice(None)]*nd
-> 4061     slice1[axis] = slice(1, None)
   4062     slice2[axis] = slice(None, -1)
   4063     try:

IndexError: list assignment index out of range

1 Ответ

0 голосов
/ 19 июня 2020

Из документации scipy.integrate.trapz :

Определение функции:

scipy.integrate.trapz(y, x=None, dx=1.0, axis=-1)

Где y должно быть "array_like". Однако вы передаете два целых значения функции trapz.

Если вы хотите интегрировать f между b и a, возможно, вы могли бы сначала определить список значений x:

a = 1
b = 5
step = 0.1 # A smaller step will give you a more precise result
x = []
for i in range(int((b-a)/step + 1)):
    x.append(a + i*step)

Затем создайте образец своей функции:

y = [f(val) for val in x]

И, наконец, вы можете интегрировать свои образцы:

result = integrate.trapz(y, x, dx=step)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...