Python 3: Ошибка получения значения, последовательность больше 32 - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь написать скрипт, который вычисляет числовые производные, используя прямое, обратное и центрированное приближения, и отображает результаты. Я сделал linspace от 0 до 2pi с 100 очками. В прошлом я делал много массивов и linspace, но я никогда не видел эту ошибку: «ValueError: последовательность слишком большая; не может быть больше 32»

Я не понимаю, в чем проблема. Вот мой сценарий:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.cos(x) + np.sin(x)

def f_diff(x):
    return np.cos(x) - np.sin(x)

def forward(x,h):   #forward approximation
    return (f(x+h)-f(x))/h

def backward(x,h):   #backward approximation
    return (f(x)-f(x-h))/h

def center(x,h):   #center approximation
    return (f(x+h)-f(x-h))/(2*h)

x0 = 0
x = np.linspace(0,2*np.pi,100)
forward_result = np.zeros(x)
backward_result = np.zeros(x)
center_result = np.zeros(x)
true_result = np.zeros(x)

for i in range(x):
    forward_result[i] = forward[x0,i]
    true_result[i] = f_diff[x0]

print('Forward (x0={}) = {}'.format(x0,forward(x0,x)))
#print('Backward (x0={}) = {}'.format(x0,backward(x0,dx)))
#print('Center (x0={}) = {}'.format(x0,center(x0,dx)))

plt.figure()
plt.plot(x, f)
plt.plot(x,f_diff)
plt.plot(x, abs(forward_result-true_result),label='Forward difference')

Я попытался установить 32 для точек linspace, но это дало мне еще одну ошибку: «TypeError:« numpy .float64 'объект не может быть интерпретирован как целое число »I тоже этого не понимаю. Что я делаю не так?

1 Ответ

0 голосов
/ 15 апреля 2020

Проблема начинается с forward_result = np.zeros(x), потому что x - это массив numpy, а не измерение. Поскольку x имеет 100 записей, np.zeros хочет создать объект в R ^ x [0] раз R ^ x [1] раз R ^ x [3] et c. Максимальное измерение - 32.

Вам нужен плоский массив np.

ОБНОВЛЕНИЕ: По запросу я добавляю исправленные строки из кода выше: forward_result = np.zeros(x.size) создает массив измерения 1.

Исправленная оценка функции выполняется через круглые скобки. Также исправлено l oop:

for i, h in enumerate(x):
    forward_result[i] = forward(x0,h)
    true_result[i] = f_diff(x0)

Наконец, на рисунке вы хотите построить numpy массив против функции. Фиксированная версия:

plt.plot(x, [f(val) for val in x])
plt.plot(x, [f_diff(val) for val in x])
...