• SciPy数值计算库


    1.最小二乘拟合

    假设有一组实验数据(x[i], y[i]),我们知道它们之间的函数关系:y = f(x),通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线型函数f(x) = k*x+b,那么参数k和b就是我们需要确定的值。如果将这些参数用 p 表示的话,那么我们就是要找到一组 p 值使得如下公式中的S函数最小:

    这种算法被称之为最小二乘拟合(Least-square fitting)。

    scipy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。下面是用leastsq进行数据拟合的一个例子:

    # -*- coding: utf-8 -*-
    import numpy as np
    from scipy.optimize import leastsq
    import pylab as pl
    
    def func(x, p):
        """
        数据拟合所用的函数: A*sin(2*pi*k*x + theta)
        """
        A, k, theta = p
        return A*np.sin(2*np.pi*k*x+theta)   
    
    def residuals(p, y, x):
        """
        实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数
        """
        return y - func(x, p)
    
    x = np.linspace(0, -2*np.pi, 100)
    A, k, theta = 10, 0.34, np.pi/6 # 真实数据的函数参数
    y0 = func(x, [A, k, theta]) # 真实数据
    y1 = y0 + 2 * np.random.randn(len(x)) # 加入噪声之后的实验数据    
    
    p0 = [7, 0.2, 0] # 第一次猜测的函数拟合参数
    
    # 调用leastsq进行数据拟合
    # residuals为计算误差的函数
    # p0为拟合参数的初始值
    # args为需要拟合的实验数据
    plsq = leastsq(residuals, p0, args=(y1, x))
    
    print u"真实参数:", [A, k, theta] 
    print u"拟合参数", plsq[0] # 实验数据拟合后的参数
    
    pl.plot(x, y0, label=u"真实数据")
    pl.plot(x, y1, label=u"带噪声的实验数据")
    pl.plot(x, func(x, plsq[0]), label=u"拟合数据")
    pl.legend()
    pl.show()

    2.非线性方程组求解

    optimize库中的fsolve函数可以用来对非线性方程组进行求解。它的基本调用形式如下:

    fsolve(func, x0)

    下面是一个实际的例子,求解如下方程组的解:

    • 5*x1 + 3 = 0
    • 4*x0*x0 - 2*sin(x1*x2) = 0
    • x1*x2 - 1.5 = 0

    程序如下:

    from scipy.optimize import fsolve
    from math import sin,cos
    
    def f(x):
        x0 = float(x[0])
        x1 = float(x[1])
        x2 = float(x[2])
        return [
            5*x1+3,
            4*x0*x0 - 2*sin(x1*x2),
            x1*x2 - 1.5
        ]
    
    result = fsolve(f, [1,1,1])
    
    print result
    print f(result)

    输出为:

    [-0.70622057 -0.6        -2.5       ]
    [0.0, -9.126033262418787e-14, 5.329070518200751e-15]

    如果方程组中的未知数很多,而与每个方程有关的未知数较少时,即雅可比矩阵比较稀疏时,传递一个计算雅可比矩阵的函数将能大幅度提高运算速度。

    result = fsolve(f, [1,1,1], fprime=j)
    
  • 相关阅读:
    mysql之drop、truncate和delete的区别
    mysql之表结构,表空间,段,区,页,MVCC(待整理)
    mysql之子查询、视图、事务及pymysql等
    mysql之单表查询、多表查询
    解决跨域问题!
    项目--2
    项目--1
    后端接口书写
    VUE-组件
    VUE基本写法
  • 原文地址:https://www.cnblogs.com/zhoulixue/p/6497157.html
Copyright © 2020-2023  润新知