python中的高斯(-Legendre)求积
我试图用高斯求积来近似函数的积分。(更多信息请点击此处:)。第一个函数在区间[-1,1]上。通过变量的变化,第二个函数被推广到[a,b]。问题是我一直得到错误“'numpy.ndarray'对象不可调用”。我假设(如果我错了,请纠正我)这意味着我尝试将数组w和x作为函数调用,但我不确定如何解决这个问题 这是密码python中的高斯(-Legendre)求积,python,numpy,gaussian,numerical-integration,Python,Numpy,Gaussian,Numerical Integration,我试图用高斯求积来近似函数的积分。(更多信息请点击此处:)。第一个函数在区间[-1,1]上。通过变量的变化,第二个函数被推广到[a,b]。问题是我一直得到错误“'numpy.ndarray'对象不可调用”。我假设(如果我错了,请纠正我)这意味着我尝试将数组w和x作为函数调用,但我不确定如何解决这个问题 这是密码 from __future__ import division from pylab import * from scipy.special.orthogonal import p_ro
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
gauss1(f,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
高斯1(f,4)
文件“C:/Users/Me/Desktop/hw8.py”,第16行,单位为1
G=和(w[i]*f(x[i]))
TypeError:“numpy.ndarray”对象不可调用
高斯(f,0,1,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
高斯(f,0,1,4)
文件“C:/Users/Me/Desktop/hw8.py”,第23行,高斯格式
G=0.5*(b-a)*和(w[i]*f(0.5*(b-a)*x[i]+0.5*(b+a)))
TypeError:“numpy.ndarray”对象不可调用
在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
您在第二个函数中执行了类似的操作。正如Will所说,您对数组和函数感到困惑 您需要定义要单独积分的函数,并将其传递到高斯 例如 您也不需要循环,因为numpy数组是对象 ,我的一个小项目,可能有助于:
导入numpy
导入四边形
def f(x):
返回numpy.exp(x)
方案=四边形直线段高斯勒让德(10)
val=scheme.integrate(f[0.0,1.0])
打印(val)
1D还有许多其他求积方案。示例:使用n=2的高斯积分求解b=pi/2和a=0的积分2+sinX
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)
如果我将其更改为:
deftest(f,n):[x,w]=p_根(n+1),范围(n+1):f[I]=(1-x[I]**2)**0.5g=sum(w[I]*f([I])返回G
,那么我得到错误:文件“C:/Users/Me/Desktop/hw8.py”,在测试f[I]=(1-x[I]**2)的第29行**0.5:TypeError:“内置函数”或“方法”对象不支持项分配:
(很抱歉没有换行符……)是的,这是因为您正在将函数传递给gauss1(f,n)
,目的是创建近似于它的Gauss-Legendre求积。然后,您应该在函数内部调用f(x)
来创建正交
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
1.7182818284590464
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)