Печать переменной с помощью matplotlib ax.text печатает список значений вместо числа?

В настоящее время я пытаюсь создать программу, которая будет отображать функцию с помощью matplotlib, наносить на нее график, затенять область под кривой между двумя переменными и использовать правило Симпсона 3/8 для вычисления затененной области. Однако при попытке напечатать переменную, которую я присвоил конечному значению интеграла, он печатает список.

Для начала вот база моего кода:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

Это определение определяет функцию, с которой я буду работать здесь, простой полином.

def func(x):
    return (x - 3) * (x - 5) * (x - 7) + 85

Вот функция, которая вычисляет площадь под кривой

def simpson(function, a, b, n):
    """Approximates the definite integral of f from a to b by the
    composite Simpson's rule, using n subintervals (with n even)"""

if n % 2:
    raise ValueError("n must be even (received n=%d)" % n)

h = (b - a) / n #The first section of Simpson's 3/8ths rule
s = function(a) + function(b) #The addition of functions over an interval

for i in range(1, n, 2):
    s += 4 * function(a + i * h)
for i in range(2, n-1, 2):
    s += 2 * function(a + i * h)

return s * h / 3

Теперь определение правила Симпсона закончено, и для простоты я определил несколько переменных.

a, b = 2, 9  # integral limits
x = np.linspace(0, 10) #Generates 100 points evenly spaced between 0 and 10
y = func(x) #Just defines y to be f(x) so its ez later on

fig, ax = plt.subplots()
plt.plot(x, y, 'r', linewidth=2)
plt.ylim(ymin=0)

final_integral = simpson(lambda x: y, a, b, 100000)

В этот момент что-то должно быть повреждено, но я включу остальную часть кода на случай, если вы сможете обнаружить проблему дальше.

# Make the shaded region
ix = np.linspace(a, b)
iy = func(ix)
verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')
ax.add_patch(poly)

plt.text(0.5 * (a + b), 30, r"$\int_a^b f(x)\mathrm{d}x$",
     horizontalalignment='center', fontsize=20)
ax.text(0.25, 135, r"Using Simpson's 3/8ths rule, the area under the curve is: ", fontsize=20)

Вот где должно быть напечатано целое значение:

ax.text(0.25, 114, final_integral , fontsize=20)

Вот остальная часть кода, необходимого для построения графика:

plt.figtext(0.9, 0.05, '$x$')
plt.figtext(0.1, 0.9, '$y$')

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.xaxis.set_ticks_position('bottom')

ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([])

plt.show()

При запуске этой программы вы получаете этот график, и серия чисел была напечатана там, где должна быть область под кривой

Любая помощь здесь приветствуется. Я полностью застрял. Кроме того, извините, если это немного, это мой первый вопрос на форуме.

2 ответа

Вы пытались напрямую использовать функцию simpson() для функции func(), в отличие от использования лямбда-установки?

Я думаю, что это может сработать:

final_integral = simpson(func, a, b, 100000)

Вы также можете попробовать:

final_integral = simpson(lambda x: func(x), a, b, 100000)    

Что происходит, так это то, что y является массивом со значениями func (x), и когда вы используете выражение lambda x: y вы на самом деле создаете постоянную функцию вида f (x) = y = const. Ваш final_integral затем список интегралов, где каждый интеграл был постоянной функцией с определенным значением из массива y.

Обратите внимание, что вы можете форматировать это число при печати на графике, если в нем много конечных десятичных знаков. Как это сделать, зависит от того, используете ли вы Python 2 или 3.

Вы назначили x как linspace, который является массивом, поэтому y также является массивом значений функции x. Вы можете заменить эту строку кода:

#old:
final_integral = simpson(lambda x:y, a, b, 100000)

#new:
final_integral = simpson(lambda t:func(t), a, b, 100000)

Изменение переменной с x на t даст вам значение для области под этой кривой. Надеюсь это поможет.

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