Объект «Символ» не имеет атрибута «грех» - PullRequest
0 голосов
/ 29 ноября 2018

Я определил функцию integrate_boole следующим образом:

def integrate_boole(f,l,r,N):
N = 4 * int(N // 4)
h=((r-l)/N)
xN = np.linspace(l,r,N+1)
fN = f(xN)
return ((2*h)/45)*(7*fN[0]+32*(np.sum(fN[1:-1:2]))+12*. (np.sum(fN[2:-2:4]))+14*(np.sum(fN[4:-4]))+7*fN[-1])

Я сейчас пытаюсь интегрировать между 0 и пи для f (x), где f (x) определяется как:

def f(x):
return x*np.sin(x)/(1+np.cos(x)**2)

Когда я подставляю f (x) в функцию:

integrate_boole(f(x),0,np.pi,8)

я получаю следующее сообщение об ошибке:

-----------------------------------------------------------------------  ----
AttributeError                            Traceback (most recent call    last)
<ipython-input-23-91f1a95793b5> in <module>()
----> 1 integrate_boole(f(x),0,np.pi,8)

 <ipython-input-20-165d275ae26c> in f(x)
  1 def f(x):
----> 2     return x*np.sin(x)/(1+np.cos(x)**2)
  3 myx = np.linspace(0,np.pi,1000)
  4 plt.plot(myx,f(myx),label=r"$f(x)=\frac{x\sin{x}}{1+\cos^2{x}}$")
  5 plt.ylabel("$f(x)$")

AttributeError: 'Symbol' object has no attribute 'sin'

Первоначально я импортировал следующие библиотекив начале той же записной книжки:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
from ipywidgets.widgets import interact
sym.init_printing(use_latex="mathjax")
x, y, z, t = sym.symbols('x y z t')

Я проверил другие статьи примерно на ту же тему, однако я не верю, что мои бесцельные и симпатичные библиотеки конфликтуют, как они, похоже, сделали для другихлюди.Но они могут быть, и я не знаю почему.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 29 ноября 2018

Первый аргумент integrate_boole должен быть функцией.

  • f является функцией
  • f(x) является числом, возвращаемым функцией f дляinput x.

Вам нужно позвонить

integrate_boole(f,0,np.pi,8)

, а не

integrate_boole(f(x),0,np.pi,8)

Вот полный код с правильным отступом:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sym

x, y, z, t = sym.symbols('x y z t')

def integrate_boole(f,l,r,N):
    N = 4 * int(N // 4)
    h=((r-l)/N)
    xN = np.linspace(l,r,N+1)
    fN = f(xN)
    return ((2*h)/45)*(7*fN[0]+32*(np.sum(fN[1:-1:2]))+12*(np.sum(fN[2:-2:4]))+14*(np.sum(fN[4:-4]))+7*fN[-1])

def f(x):
    return x*np.sin(x)/(1+np.cos(x)**2)

integrate_boole(f,0,np.pi,8)
# 2.470207745145361
...