使用Python解决4参数(Rodbard方程)的常数

时间:2016-02-17 21:12:30

标签: python variables scipy nonlinear-functions equations

我是python的新手,我想要做的是编写一个算法来解决Rodbard方程中的4个未知参数,我们将使用ImageJ测量的灰度值与光密度校准光盘相关联。该等式是非线性的并且写为y = c *((x-a)/(d-x))^(1 / b)其中a,b,c和d是未知的。我有四个点(176.5,0),(161.333,0.1),(66.1667,0.9)和(40.833,2.5)的x和y值。下面,我已经发布了我试图解决这4个未知数的尝试。任何指导我正确方向的帮助都将不胜感激!

    import scipy.optimize as opt

    def f(a, b, c, d):
         0 == [c * ((176.5 - a)/(d - 176.5))**(1/b)]
         0.1 == [c * ((161.333 - a)/(d - 161.333))**(1/b)]
         0.9 == [c * ((66.1667 - a)/(d - 66.1667))**(1/b)]
         2.5 == [c * ((40.833 - a)/(d - 40.833))**(1/b)]
    return f

    opt.curve_fit(a, b, c, d)

    print a
    print b
    print c
    print d

2 个答案:

答案 0 :(得分:2)

如果您想使用curve_fit,您应该执行以下操作:

def f(x1, a1, b1, c1, d1):
    return c1 * (((x1 - a1)/(d1 - x1))**1/b1)

x_data = np.array([176.5, 161.333, 66.1667, 40.833])
y_data = np.array([0., 0.1, 0.9, 2.5])
p0 = np.array([168., -0.01, -7.4, 35000.])

popt, pcov = opt.curve_fit(f, x_data, y_data, p0, None, False, True, ftol = 0.00001)

p0是初始猜测,如果你不通知它,将假设一个全数组的数组。

根据提供的数据,我尝试了不同的参数,但我找不到解决方案。

我希望这会有所帮助。祝你好运!

答案 1 :(得分:0)

这与此问题类似:How to solve a pair of nonlinear equations using Python?

但这似乎没有给我正确的答案。尝试复制并添加更多积分吗?

from scipy.optimize import fsolve

def equations(p):
    a,b,c,d = p
    return ((c * ((176.5-a)/(d-176.5))**(1/b)),
            (c * ((161.333-a)/(d-161.333))**(1/b))-0.1,
            (c * ((66.1667-a)/(d-66.1667))**(1/b))-0.9,
            (c * ((40.833-a)/(d-40.833))**(1/b))-2.5)

a,b,c,d = fsolve(equations, (1,1,1,1))
print a,b,c,d

输出:

1.0 1.0 1.0 1.0