zoukankan      html  css  js  c++  java
  • python应用 曲线拟合04

    python应用 曲线拟合04 → 多项式拟合


    • 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲线的横纵坐标分别为第 1, 2 个参数,第 3 个参数 3 表示使用 3 次多项式拟合。得到的拟合结果写入返回列表 z,按照幂指数从高到低排序,比如这里 z[0] 代表 x3 前面的系数,z[1] 代表 x2 前面的系数,以此类推。
      1 import xlrd
      2 import xlwt
      3 import numpy as np
      4 import matplotlib.pyplot as plt
      5 
      6 
      7 def pol2(x, a, b, c):
      8     x = np.array(x)
      9     return a + b*x + c*pow(x, 2)
     10 
     11 
     12 def pol3(x, a, b, c, d):
     13     x = np.array(x)
     14     return a + b*x + c*pow(x, 2) + d*pow(x, 3)
     15 
     16 
     17 def pol4(x, a, b, c, d, e):
     18     x = np.array(x)
     19     return a + b*x + c*pow(x, 2) + d*pow(x, 3) + e*pow(x, 4)
     20 
     21 
     22 def pol5(x, a, b, c, d, e, f):
     23     x = np.array(x)
     24     return a + b*x + c*pow(x, 2) + d*pow(x, 3) + e*pow(x, 4) + f*pow(x, 5)
     25 
     26 
     27 def pol6(x, a, b, c, d, e, f, g):
     28     x = np.array(x)
     29     return a + b*x + c*pow(x, 2) + d*pow(x, 3) + e*pow(x, 4) + f*pow(x, 5) +
     30         g*pow(x, 6)
     31 
     32 
     33 def main():
     34     data_file = xlrd.open_workbook('./data_78As.xlsx')
     35     sheet_proton = data_file.sheet_by_name('proton')
     36     sheet_neutron = data_file.sheet_by_name('neutron')
     37 
     38     write_excl = xlwt.Workbook(encoding='utf-8')
     39     write_sheet_proton = write_excl.add_sheet('proton')
     40     write_sheet_neutron = write_excl.add_sheet('neutron')
     41 
     42     x_proton = sheet_proton.col_values(0)
     43     x_proton_add = x_proton[:]
     44     x_proton_add.insert(0, 0.23)
     45     x_proton_add.insert(0, 0.22)
     46     x_proton_add.insert(0, 0.21)
     47     x_proton_add.insert(0, 0.20)
     48     x_proton_add.append(0.36)
     49     x_proton_add.append(0.37)
     50     x_proton_add.append(0.38)
     51     x_proton_add.append(0.39)
     52     x_proton_add.append(0.40)
     53 
     54     j = 0
     55     for temp in x_proton_add:
     56         write_sheet_proton.write(j, 0, temp)
     57         j = j + 1
     58 
     59     for i in range(18):
     60         y = sheet_proton.col_values(i+1)
     61         plt.scatter(x_proton, y)
     62         print(y)
     63         #  popt, pcov = curve_fit(pol5, x_proton, y, [1, 1, 1, 1, 1, 1])
     64         #  print(popt)
     65 
     66         z = np.polyfit(x_proton, y, 3)
     67 
     68         y_fit = pol3(x_proton_add, z[3], z[2], z[1], z[0])
     69         plt.plot(x_proton_add, y_fit, color='green', linewidth=1.0)
     70         plt.show()
     71         j = 0
     72         for temp in y_fit:
     73             print(x_proton_add[j])
     74             if x_proton_add[j] <= 0.23:
     75                 write_sheet_proton.write(j, i+1, temp)
     76                 j = j + 1
     77             elif x_proton_add[j] > 0.23 and x_proton_add[j] < 0.35:
     78                 write_sheet_proton.write(j, i+1, y[j-4])
     79                 j = j + 1
     80             else:
     81                 write_sheet_proton.write(j, i+1, temp)
     82                 j = j + 1
     83 
     84     plt.clf()
     85     x_neutron = sheet_neutron.col_values(0)
     86     x_neutron_add = x_neutron[:]
     87     x_neutron_add.insert(0, 0.23)
     88     x_neutron_add.insert(0, 0.22)
     89     x_neutron_add.insert(0, 0.21)
     90     x_neutron_add.insert(0, 0.20)
     91     x_neutron_add.append(0.36)
     92     x_neutron_add.append(0.37)
     93     x_neutron_add.append(0.38)
     94     x_neutron_add.append(0.39)
     95     x_neutron_add.append(0.40)
     96 
     97     j = 0
     98     for temp in x_neutron_add:
     99         write_sheet_neutron.write(j, 0, temp)
    100         j = j + 1
    101 
    102     for i in range(18):
    103         y = sheet_neutron.col_values(i+1)
    104         plt.scatter(x_neutron, y)
    105         print(y)
    106         #  popt, pcov = curve_fit(pol5, x_proton, y, [1, 1, 1, 1, 1, 1])
    107         #  print(popt)
    108 
    109         z = np.polyfit(x_neutron, y, 3)
    110 
    111         y_fit = pol3(x_neutron_add, z[3], z[2], z[1], z[0])
    112         plt.plot(x_neutron_add, y_fit, color='green', linewidth=1.0)
    113         plt.show()
    114         j = 0
    115         for temp in y_fit:
    116             if x_neutron_add[j] <= 0.23:
    117                 write_sheet_neutron.write(j, i+1, temp)
    118                 j = j + 1
    119             elif x_neutron_add[j] > 0.23 and x_neutron_add[j] < 0.35:
    120                 write_sheet_neutron.write(j, i+1, y[j-4])
    121                 j = j + 1
    122             else:
    123                 write_sheet_neutron.write(j, i+1, temp)
    124                 j = j + 1
    125 
    126     write_excl.save("result_78As.xls")
    127 
    128 
    129 if __name__ == '__main__':
    130     main()

    得到结果:

  • 相关阅读:
    Laravel入坑指南(5)——请求与响应
    Laravel入坑指南(4)——数据库(Mysql)
    CentOS7 开机网卡加载失败
    个人CKeditor的config.js配置
    取消ie浏览器edge浏览器输入框右边的叉和眼睛
    angularjs中ckeditor的destroy问题
    angular js ckeditor directive示例代码
    建立没有文件名的文件
    设置ckeditor文本框的宽度为百分比自适应
    js中遍历删除数组中的项(项目中遇到的问题解决)
  • 原文地址:https://www.cnblogs.com/kurrrr/p/13624942.html
Copyright © 2011-2022 走看看