已知公式求参的过程,对工程而言,一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例,来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程,原本需要使用matlab,现在python照样可以做到。
假定我们有一个确定的方程,比如
y = k*x1?+ g*x2 /v(x1+x2)
def func(x, k, g, v):
(x1, x2) = x
seg1 = k*x1;
seg2 = g*x2/v*(x1+x2);
y = seg1 + seg2;
return y;
三个参数,原本三组数据就可以出结果,这就是超定方程的含义。数据点比需要的更多。
#data.csv
14,1 ,3
20,5 ,9
11,7,13
100,9,4
120,8,10
注意这里的x1,x2组合成一个x参数的过程。它涉及多参数求解的处理。
def CalcParamsOfFun(file_name):
# 设置初始参数猜测
initial_guess = (1,1,1);
# 准备数据
filename = "data.csv" # 文件名
y = load_csv_data(filename, 0); #y
x1 = load_csv_data(filename, 1); #x1
x2 = load_csv_data(filename, 2); #x2
y_ar = [];
for item in y:
y_ar.append(item);
y = y_ar;
x1_data = x1;
x2_data = x2;
data = (x1_data, x2_data)
# 使用curve_fit函数进行拟合
popt, pcov = curve_fit(func, data, y_ar, p0=initial_guess)
# 显示拟合参数和拟合误差
print(popt)
print(pcov)
return popt;
最终popt就是求解出的参数,而剩余的部分pcov是一个协方差矩阵,它反映了整个运算出的参数的不确定度:
[[ 1.55391864e-01 4.35894622e-04 -1.01903114e-03]
?[ 4.35894622e-04 4.97531727e-06 2.31409704e-05]
?[-1.01903114e-03 2.31409704e-05 3.43718230e-04]]
它的对角线的每一个值,是验算出的参数的可能误差。这里计算出的k的误差有15.5%这是一个比较大的误差,可能对运算精度产生较大影响。矩阵中对角线以外的元素是元素之间的关联关系,较大的值表示两个元素之间可能存在相关性。这里可以看出它们各自的相关性是很小的。
注意,这里的协方差具体数值与公式不符,因为我没有实际制作一笔数据和公式精确匹配。只是用来举例说明。
你可以直观看出公式计算得到的量和实际的数据之间的误差。
def ReCalcCurr_inByCalc(file_name, params):
# 准备数据
filename = "data.csv" # 文件名
y = load_csv_data(filename, 0); #y
x1 = load_csv_data(filename, 1); #x1
x2 = load_csv_data(filename, 2); #x2
y_ar = [];
for item in y:
y_ar.append(item);
y = y_ar;
x1_data = x1;
x2_data = x2;
data = (x1_data, x2_data)
? ? for i in np.arange(len(x1_data)):
? ? ? ? data = (x1_data[i], x2_data[i]);
? ? ? ? print(func(data, params[0], params[1], params[2]), y[i])