我该如何简化这个呢?

时间:2018-05-19 22:10:23

标签: python

我正在尝试将numpy应用于我为trapezium规则集成编写的代码:

def integral(a,b,n):
    delta = (b-a)/float(n)

    s = 0.0
    s+= np.sin(a)/(a*2)
    for i in range(1,n):
         s +=np.sin(a + i*delta)/(a + i*delta)
    s += np.sin(b)/(b*2.0)
    return s * delta

我试图从新函数获取返回值,如下所示:

return delta *((2 *np.sin(x[1:-1])) +np.sin(x[0])+np.sin(x[-1]) )/2*x

我现在试图取得任何突破,但我的所有尝试都失败了。

我尝试过但我没有得到的一件事是为什么以下代码会出现too many indices for array错误?

 def integral(a,b,n):
      d = (b-a)/float(n)
      x = np.arange(a,b,d)
      J = np.where(x[:,1] < np.sin(x[:,0])/x[:,0])[0]

非常感谢每一个提示/建议。

2 个答案:

答案 0 :(得分:1)

您忘了总结sin(x)

>>> def integral(a, b, n):
...     x, delta = np.linspace(a, b, n+1, retstep=True)
...     y = np.sin(x)
...     y[0] /= 2
...     y[-1] /= 2
...     return delta * y.sum()
... 
>>> integral(0, np.pi / 2, 10000)
0.9999999979438324
>>> integral(0, 2 * np.pi, 10000)
0.0
>>> from scipy.integrate import quad
>>> quad(np.sin, 0, np.pi / 2)
(0.9999999999999999, 1.1102230246251564e-14)
>>> quad(np.sin, 0, 2 * np.pi)
(2.221501482512777e-16, 4.3998892617845996e-14)

答案 1 :(得分:0)

我也同时试过这个。

import numpy as np

def T_n(a, b, n, fun):
    delta = (b - a)/float(n)                # delta formula
    x_i = lambda a,i,delta: a + i * delta   # calculate x_i
    return 0.5 * delta * \
           (2 * sum(fun(x_i(a, np.arange(0, n + 1), delta))) \
            - fun(x_i(a, 0, delta)) \
            - fun(x_i(a, n, delta)))

使用本页底部的公式重建代码 https://matheguru.com/integralrechnung/trapezregel.html

范围(0,n + 1)的求和 - 给出[0,1,...,n] - 使用numpy实现。通常,您将在普通Python中使用for循环收集值。 但是这里可以使用numpy的矢量化行为。 np.arange(0,n + 1)给出一个np.array([0,1,...,n])。

如果作为函数的参数给出(此处抽象为fun) - x_0x_n的函数公式 然后计算。并收集在一个numpy阵列。因此,fun(x_i(...))会将x_0上应用的函数的numpy数组返回到x_n。此数组/列表由sum()总结。

将整个sum()乘以2,然后减去x_0和x_n的函数值。 (因为在梯形公式中只有中间的加数,而不是第一个和最后一个,乘以2)。这有点像黑客。

链接的德语页面用作函数fun(x) = x ^ 2 + 3 通过使用lambda表达式可以很好地定义它:

fun = lambda x: x ** 2 + 3
a = -2
b = 3
n = 6

您也可以使用正常的函数定义:defun fun(x): return x ** 2 + 3。 所以我通过输入命令进行测试:

T_n(a, b, n, fun)

哪次正确返回:

## Out[172]: 27.24537037037037

对于您的情况,只需将np.sin分配给fun,将abn的值分配到此函数调用中。

像:

fun = np.sin      # by that eveywhere where `fun` is placed in function, 
# it will behave as if `np.sin` will stand there - this is possible,
# because Python treats its functions as first class citizens
a   = #your value
b   = #your value
n   = #your value

最后,您可以致电:

T_n(a, b, n, fun)

它会起作用!