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

0.引言

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

1. 示例1,问题描述

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

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

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

def func(x, k, g, v):
    (x1, x2) = x
    seg1 = k*x1;
    seg2 = g*x2/v*(x1+x2);
    y = seg1 + seg2;
    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参数的过程。它涉及多参数求解的处理。

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;

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校验

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

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])

你可能感兴趣的:(python,算法,函数拟合)