scipy:使用向量输入和标量输出查找函数的根

qij5mzcb  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(418)

这是我的最小工作示例。很简单,我基本上得到了一个密度值 z 我想找到等高线上的任何一点。我是通过寻根来实现的。

import numpy as np
from scipy.stats import multivariate_normal
from scipy.optimize import root

# Define the density

mu = np.zeros(2)
Sigma = np.eye(2)
target = multivariate_normal(mu, Sigma)

# Contour value

z = target.pdf(target.rvs())

# Find a point on its contour

def func(x):
    return target.pdf(x) - z
root(func, mu)

这将引发以下错误
typeerror:fsolve:“func”参数“func”的输入和输出形状不匹配。形状应为(2,),但为(1,)。

jexiocij

jexiocij1#

文件 root 他说, fun
求其根的向量函数。
我猜他们的意思是,乐趣是从ndim->ndimMap而不是从ndim->1Map。
所以一个选择是两个人为地破坏你的功能来满足这个要求。

def func(x):
    y = target.pdf(x) - z
    return [y] * len(x)

另一种选择是使用 minimize 而不是 root .

import numpy as np
from scipy.stats import multivariate_normal
from scipy.optimize import root, minimize

target = multivariate_normal(np.zeros(2), np.eye(2))
z = target.pdf(target.rvs())

def fun_root(x):
    return [target.pdf(x) - z]*2

def fun_minimize(x):
    return (target.pdf(x) - z)**2

x0 = np.random.uniform(low=-1, high=+1, size=2)

res_root = root(fun=fun_root, x0=x0)
print('root')
print(res_root.x)
print(res_root.fun)

print('minimize')
res_min = minimize(fun=fun_minimize, x0=x0, tol=1e-10)
print(res_min.x)
print(res_min.fun)

此外,我建议使用另一个初步猜测。在我看来,对于你的例子有很多可能的解决方案,所以请注意这一点。

相关问题