繁体   English   中英

使用涉及积分的方程提高 scipy.optimize.fsolve 的准确性

[英]Improving accuracy in scipy.optimize.fsolve with equations involving integration

我正在尝试使用以下代码求解积分方程(删除了不相关的部分):

def _pdf(self, a, b, c, t):
    pdf = some_pdf(a,b,c,t)
    return pdf

def _result(self, a, b, c, flag):
    return fsolve(lambda t: flag - 1 + quad(lambda tau: self._pdf(a, b, c, tau), 0, t)[0], x0)[0]

它采用概率密度函数并找到结果tau使得 pdf 从 tau 到无穷大的积分等于flag 请注意, x0是脚本中其他地方定义的根的(浮点)估计值。 还要注意flag是一个非常小的数字,大约为1e-9

在我的应用程序中, fsolve 只有大约 50% 的时间才能成功找到根。 它通常只返回x0 ,显着影响我的结果。 pdf的积分没有封闭形式,所以我被迫进行数值积分并觉得这可能会引入一些不准确?

编辑:

此后已使用除下面描述的方法以外的方法解决了此问题,但我想让 quadpy 工作并查看结果是否有所改善。 我试图开始工作的具体代码如下:

import quadpy
import numpy as np
from scipy.optimize import *
from scipy.special import gammaln, kv, gammaincinv, gamma
from scipy.integrate import quad, simps

l = 226.02453163
mu = 0.00212571582056
nu = 4.86569872444
flag = 2.5e-09
estimate = 3 * mu

def pdf(l, mu, nu, t):
    return np.exp(np.log(2) + (l + nu - 1 + 1) / 2 * np.log(l * nu / mu) + (l + nu - 1 - 1) / 2 * np.log(t) + np.log(
        kv(nu - l, 2 * np.sqrt(l * nu / mu * t))) - gammaln(l) - gammaln(nu))


def tail_cdf(l, mu, nu, tau):
    i, error = quadpy.line_segment.adaptive_integrate(
        lambda t: pdf(l, mu, nu, t), [tau, 10000], 1.0e-10
    )
    return i

result = fsolve(lambda tau: flag - tail_cdf(l, mu, nu, tau[0]), estimate)

当我运行它时,我从assert all(lengths > minimum_interval_length)得到一个断言错误。 我不太确定如何解决这个问题。 任何帮助将不胜感激!

例如,我尝试了1 / x 1alpha之间的积分来检索目标积分2.0 这个

import quadpy
from scipy.optimize import fsolve

def f(alpha):
    beta, _ = quadpy.quad(lambda x: 1.0/x, 1, alpha)
    return beta

target = 2.0
res = fsolve(lambda alpha: target - f(alpha), x0=2.0)
print(res)

正确返回7.38905611

失败的 quadpy 断言

assert all(lengths > minimum_interval_length)

你得到的意思是自适应集成达到了它的极限:要么放宽你的容忍度,要么减少minimum_interval_length (见这里)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM