python - ValueError:函数返回的数组在调用 scipy.fsolve() 之间改变了大小
问题描述
我正在尝试使用 scipy.optimize.fsolve() 来求解使函数等于零的 x,但不断收到上述错误。我的代码是:
import scipy.optimize as optimize
from scipy.stats import genextreme as gev
gevcombined = [(-0.139, 3.035, 0.871),(-0.0863, 3.103, 0.818),(-0.198, 3.13, 0.982)]
ratio = [0.225, 0.139, 0.294]
P = [0.5,0.8,0.9,0.96,0.98,0.99]
def mixedpop(x):
for j in range(len(ratio)):
F = (ratio[j]*gev.cdf(x,gevcombined[j][0],gevcombined[j][1],gevcombined[j][2]))+((1-ratio[j]*gev.cdf(x,gevcombined[j][0],gevcombined[j][1],gevcombined[j][2]))-P
return F
initial = 10
Rm = optimize.fsolve(mixedpop,initial)
我不断收到错误:
ValueError:the array returned by a function changed size between calls
这个错误是什么意思?预期输出将是每个 P 值的值。因此,对于每个比率,来自 Rm 的 x 值将等于 [3.5, 4, 5.4, 6.3, 7.2, 8.1]
解决方案
好的,我想出了如何让 fsolve 为一系列解决方案工作。
如果我这样写整个事情,它会起作用:
Rm = []
initial = [10,10,10,10,10,10]
for j in range(len(ratio)):
f = lambda x : (ratio[j]*gev.cdf(x,gevcombined[j][0],gevcombined[j][1],gevcombined[j][2]))+((1-ratio[j]*gev.cdf(x,gevcombined[j][0],gevcombined[j][1],gevcombined[j][2]))-P
Rm.append(list(optimize.fsolve(f,initial)))
我的输出是:
[[3.37, 4.37, 5.13, 6.43, 7.91, 9.88],[3.41, 4.42, 5.09, 6.13, 7.07, 8.18],[3.49, 4.87, 5.95, 7.51, 8.80, 10.19]]
推荐阅读
- vue.js - 使用 Webpack 4 在 Phoenix 1.4 应用程序中安装 Vue 2
- asp.net-web-api - System.InvalidOperationException(An exception was thrown while attempting to evaluate a LINQ query parameter expression)
- python - 将输出绑定到只读文本输入
- swift - 使用 Swift 获取 RSA 私钥的 n 和 d
- javascript - 呈现相同的视图并防止表单重新提交确认
- android - 不同的活动意图 - 相同的列表
- swift - 函数 prepareForSegue 的强制转换问题
- c# - 如何在 xamarin 中获取 ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED 的值?
- python-3.x - 具有或不具有对象继承的 tkinter GUI
- python - 为一个函数获取无限循环,但不是为类似函数获取无限循环,尝试验证日期输入