scipy 如何在numpy中使用一些固定参数对函数进行矢量化?

nszi6y05  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(139)

我写了一个代码,用伯恩斯坦多项式(https://en.wikipedia.org/wiki/Bernstein_polynomial)逼近函数。

https://github.com/pdenapo/metodos-numericos/blob/master/python/bernstein.py
我有一个函数,它给出的多项式近似f为伯恩斯坦(f,n,p)(其中f是我想近似的函数,n是阶数,p是它被求值的点。

def bernstein(f, n, p):
    return np.sum(
        [f(k / n) * st.binom.pmf(k, n, p) for k in np.arange(0, n + 1)])

现在我想画出这个函数的曲线,其中f和n是固定的,p通过由np生成的向量。

bernstein3 = lambda x: bernstein(f, 3, x)
 bernstein3 = np.vectorize(bernstein3)
 y3 = bernstein3(x)
 plt.plot(x, y3, 'green', label='$B_3$')

这是可行的。但我想一定有一些更优雅的,或者可能是更Python的方式来做这件事。有什么建议吗?非常感谢

js81xvg6

js81xvg61#

由于SciPy统计函数是矢量化的,因此可以直接修改bernstein函数,使其以矢量化的方式工作:

import numpy as np
import scipy.stats

def bernstein(f, n, p):
    # Vector of k values
    k = np.arange(n + 1)
    # Add a broadcasting dimension to p
    pd = np.expand_dims(p, -1)
    # Compute approximation
    return np.sum(f(k / n) * scipy.stats.binom.pmf(k, n, pd), -1)

它将被简单地用作:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.abs(1 / 2 - x)

x = np.linspace(0, 1, 100)
y = f(x)
plt.plot(x, y, 'blue', label='f(x)')
y_approx = bernstein(f, 10, x)
plt.plot(x, y_approx, 'orange', label='f_approx(x)')
plt.show()

相关问题