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

Solve for constants of 4-parameter (Rodbard Equation) using Python

我是 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

这看起来类似于这个问题: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

如果您想使用 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 是初始猜测,如果您不通知它,将假定为一个数组。

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

希望对您有所帮助。祝你好运!