当前位置:   article > 正文

由实验数据进行函数拟合的python实现

由实验数据进行函数拟合的python实现

0.引言

已知公式求参的过程,对工程而言,一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例,来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程,原本需要使用matlab,现在python照样可以做到。

1. 示例1,问题描述

假定我们有一个确定的方程,比如

y = k*x1 + g*x2 /v(x1+x2)

1.1首先我们构建公式本身:

  1. def func(x, k, g, v):
  2. (x1, x2) = x
  3. seg1 = k*x1;
  4. seg2 = g*x2/v*(x1+x2);
  5. y = seg1 + seg2;
  6. return y;

1.2 然后进行实验,采集相关参数:

三个参数,原本三组数据就可以出结果,这就是超定方程的含义。数据点比需要的更多。

#data.csv

14,1 ,3

20,5 ,9

11,7,13

100,9,4

120,8,10

1.3 求解

注意这里的x1,x2组合成一个x参数的过程。它涉及多参数求解的处理。

  1. def CalcParamsOfFun(file_name):
  2. # 设置初始参数猜测
  3. initial_guess = (1,1,1);
  4. # 准备数据
  5. filename = "data.csv" # 文件名
  6. y = load_csv_data(filename, 0); #y
  7. x1 = load_csv_data(filename, 1); #x1
  8. x2 = load_csv_data(filename, 2); #x2
  9. y_ar = [];
  10. for item in y:
  11. y_ar.append(item);
  12. y = y_ar;
  13. x1_data = x1;
  14. x2_data = x2;
  15. data = (x1_data, x2_data)
  16. # 使用curve_fit函数进行拟合
  17. popt, pcov = curve_fit(func, data, y_ar, p0=initial_guess)
  18. # 显示拟合参数和拟合误差
  19. print(popt)
  20. print(pcov)
  21. return popt;

1.4 求解结果识读:

最终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%这是一个比较大的误差,可能对运算精度产生较大影响。矩阵中对角线以外的元素是元素之间的关联关系,较大的值表示两个元素之间可能存在相关性。这里可以看出它们各自的相关性是很小的。

注意,这里的协方差具体数值与公式不符,因为我没有实际制作一笔数据和公式精确匹配。只是用来举例说明。

1.5校验

你可以直观看出公式计算得到的量和实际的数据之间的误差。

  1. def ReCalcCurr_inByCalc(file_name, params):
  2. # 准备数据
  3. filename = "data.csv" # 文件名
  4. y = load_csv_data(filename, 0); #y
  5. x1 = load_csv_data(filename, 1); #x1
  6. x2 = load_csv_data(filename, 2); #x2
  7. y_ar = [];
  8. for item in y:
  9. y_ar.append(item);
  10. y = y_ar;
  11. x1_data = x1;
  12. x2_data = x2;
  13. data = (x1_data, x2_data)
  14.     for i in np.arange(len(x1_data)):
  15.         data = (x1_data[i], x2_data[i]);
  16.         print(func(data, params[0], params[1], params[2]), y[i])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/683723
推荐阅读
相关标签
  

闽ICP备14008679号