找到带约束的方程的根

时间:2013-12-02 23:59:01

标签: python math

在python中,我想找到形式的方程式的根:

-x * log(x)+(1-x)* log(n) - (1-x)* log(1 - x) - k = 0

其中n和k是将指定的参数。

对根的另一个约束是x> =(1-x)/ n。所以只是为了它的价值,我将过滤掉那些不满足它的根源。

我的第一次尝试是使用scipy.optimize.fsolve(请注意,我只是将k和n分别设置为0和1):

def f(x):                                                                       
    return -x*log(x) + (1-x)*log(1) - (1-x)*log(1-x)                            

fsolve(f, 1)

使用math.log,我得到了值错误,因为我向日志提供了错误的输入。使用numpy.log给了我一些除以零和无效值的乘法。

我调整了f,只是为了看看它会做什么:

def f(x):                                                                       
    if x <= 0:                                                                  
        return 1000                                                             
    if x >= 1:                                                                  
        return 2000                                                             
    return -x*log(x) + (1-x)*log(1) - (1-x)*log(1-x) 

现在我

/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py:221: RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last ten iterations.
  warnings.warn(msg, RuntimeWarning)     

使用python,如何在原始方程中求解x的各种n和k参数?

1 个答案:

答案 0 :(得分:1)

fsolve还允许插入猜测以便从哪里开始。我的建议是绘制方程并让用户用鼠标或文本键入初始猜测作为初始猜测。您可能还想更改越界值:

if x <= 0:
    return 1000 + abs(x)
if x >= 1:
    return 2000 + abs(x)

这样,函数在感兴趣区域之外有一个斜率,可以引导求解器回到感兴趣的区域。