赞
踩
已知公式求参的过程,对工程而言,一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例,来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程,原本需要使用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])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。