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