python中的Gauss(-Legendre)求积

2024-06-16 14:51:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用高斯求积来近似函数的积分。(此处有更多信息:http://austingwalters.com/gaussian-quadrature/)。第一个函数在区间[-1,1]上。第二个函数通过变量的变化被推广到[a,b]。问题是我一直得到错误“numpy.ndarray”对象不可调用。我想(如果我错了,请纠正我)这意味着我试图调用数组w和x作为函数,但我不确定如何解决这个问题。

这是密码

from __future__ import division
from pylab import *
from scipy.special.orthogonal import p_roots

def gauss1(f,n):
    [x,w] = p_roots(n+1)
    f = (1-x**2)**0.5
    for i in range(n+1):
        G = sum(w[i]*f(x[i]))
    return G

def gauss(f,a,b,n):
    [x,w] = p_roots(n+1)
    f = (1-x**2)**0.5
    for i in range(n+1):
        G = 0.5*(b-a)*sum(w[i]*f(0.5*(b-a)*x[i]+ 0.5*(b+a)))
    return G

这些是各自的错误消息

gauss1(f,4)
Traceback (most recent call last):

  File "<ipython-input-82-43c8ecf7334a>", line 1, in <module>
    gauss1(f,4)

  File "C:/Users/Me/Desktop/hw8.py", line 16, in gauss1
    G = sum(w[i]*f(x[i]))

TypeError: 'numpy.ndarray' object is not callable

gauss(f,0,1,4)
Traceback (most recent call last):

  File "<ipython-input-83-5603d51e9206>", line 1, in <module>
    gauss(f,0,1,4)

  File "C:/Users/Me/Desktop/hw8.py", line 23, in gauss
    G = 0.5*(b-a)*sum(w[i]*f(0.5*(b-a)*x[i]+ 0.5*(b+a)))

TypeError: 'numpy.ndarray' object is not callable

Tags: 函数infromimportnumpyfordef错误
3条回答

正如Will所说,你在数组和函数之间感到困惑。

你需要定义你想要单独积分的函数,并把它传递给高斯。

例如

def my_f(x):
    return 2*x**2 - 3*x +15 

gauss(m_f,2,1,-1)

也不需要循环,因为numpy数组是vectorized对象。

def gauss1(f,n):
    [x,w] = p_roots(n+1)
    G=sum(w*f(x))
    return G

def gauss(f,n,a,b):
    [x,w] = p_roots(n+1)
    G=0.5*(b-a)*sum(w*f(0.5*(b-a)*x+0.5*(b+a)))
    return G

示例:对于b=pi/2和a=0的积分2+sinX,使用n=2的高斯积分求解

import numpy as np

E = np.array([-0.774597, 0.000000, 0.774597])
A = np.array([0.555556, 0.888889, 0.555556])

def gauss(f, a, b, E, A):
    x = np.zeros(3)
    for i in range(3):
        x[i] = (b+a)/2 + (b-a)/2 *E[i]

    return (b-a)/2 * (A[0]*f(x[0]) + A[1]*f(x[1]) + A[2]*f(x[2]))


f = lambda x: 2 + np.sin(x)
a = 0.0; b = np.pi/2

areaGau = gauss(f, a, b, E, A)
print("Gaussian integral: ", areaGau)

gauss1(f,n)中,您将f视为数组时的函数,因为您正在重新分配它

def gauss1(f,n):
  [x,w] = p_roots(n+1)
  f = (1-x**2)**0.5 # This line is your problem.
  for i in range(n+1):
    G = sum(w[i]*f(x[i]))
  return G

在第二个函数中,您正在执行类似的操作。

相关问题 更多 >