首页 > 解决方案 > 如果函数未定义,scipy root 返回猜测

问题描述

我正在尝试进行参数研究。我有一个非常复杂的函数,它不是为所有值定义的。

我使参数变化并且任何时候都扎根,但是如果参数使我的函数未定义,则scipy.optimize.root() 返回猜测值而不是错误或'nan'.

仅当定义了函数时,我如何才能获得 root 权限(无需先确定定义函数的空间)?

我尝试创建一个简单的示例以方便理解:

import numpy as np
from scipy.optimize import root

global k
def F(X):
    np.seterr(all='raise')
    try:
       f1=np.log(4.80-(X+k))
       return f1
    except:
       return np.nan

guess = 10
ks=[i/2.0 for i in range(10)]
for k in ks: 
    root(F, guess)

标签: pythonscipy

解决方案


您应该将 try-except 块包裹在根函数周围;这也是您要测试 nan 的地方。您应该进一步捕获 scipy/root 引发的特定异常,而不是每个异常。

import numpy as np
from scipy.optimize import root

def myroot(F, guess):
    np.seterr(all='raise')
    try:
        res = root(F, guess)
    except FloatingPointError as exp:
        return guess
    if np.isnan(res):
        return guess
    return res

global k
def F(X):
    return np.log(4.80-(X+k))

ks=[i/2.0 for i in range(10)]
guess = 10
for k in ks:
    print(myroot(F, guess))

推荐阅读