首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的Gauss(-Legendre)正交

python中的Gauss(-Legendre)正交
EN

Stack Overflow用户
提问于 2014-11-24 23:09:29
回答 4查看 22.1K关注 0票数 5

我试图用高斯求积来逼近函数的积分。(这里有更多信息:http://austingwalters.com/gaussian-quadrature/)。第一个函数在区间1,1上,第二个函数通过变量的变化推广到a,b。问题是,我一直得到错误"'numpy.ndarray‘对象是不可调用的“。我假设(如果我错了请纠正我),这意味着我已经尝试将数组w和x作为函数调用,但我不知道如何解决这个问题。

这是密码

代码语言:javascript
复制
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

这些是各自的错误消息。

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-25 00:13:28

就像威尔说的,你在数组和函数之间感到困惑。

您需要定义要单独集成的函数,并将其传递给高斯。

例如。

代码语言:javascript
复制
def my_f(x):
    return 2*x**2 - 3*x +15 

gauss(m_f,2,1,-1)

您也不需要循环,因为numpy数组是矢量化对象。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-10-29 13:25:16

四边形是我的一个小项目,可能会有所帮助:

代码语言:javascript
复制
import numpy
import quadpy


def f(x):
    return numpy.exp(x)


scheme = quadpy.line_segment.gauss_legendre(10)
val = scheme.integrate(f, [0.0, 1.0])
print(val)
代码语言:javascript
复制
1.7182818284590464

对于一维,还有许多其他的求积方案。

票数 1
EN

Stack Overflow用户

发布于 2014-11-24 23:14:28

gauss1(f,n)中,当f是数组时,您将它当作一个函数对待,因为您要重新分配它;

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27115917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档