python 拟合曲线并求参

需要对数据进行函数拟合,首先画一下二维散点图,目测一下大概的分布,

所谓正态分布,就是高斯分布,正态曲线是一种特殊的高斯曲线。

python的scipy.optimize包里的curve_fit函数来拟合曲线,当然还可以拟合很多类型的曲线。scipy.optimize提供了函数最小值(标量或多维)、曲线拟合和寻找等式的根的有用算法。

import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitimport math#单个高斯模型,如果曲线有多个波峰,可以分段拟合
def func(x, a,u, sig):    return a*np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (sig * math.sqrt(2 * math.pi))#混合高斯模型,多个高斯函数相加
def func3(x, a1, a2, a3, m1, m2, m3, s1, s2, s3):    return a1 * np.exp(-((x - m1) / s1) ** 2) + a2 * np.exp(-((x - m2) / s2) ** 2) + a3 * np.exp(-((x - m3) / s3) ** 2)

#正弦函数拟合
#def fmax(x,a,b,c):
#    return a*np.sin(x*np.pi/6+b)+c
#fita,fitb=optimize.curve_fit(fmax,x,ymax,[1,1,1])#非线性最小二乘法拟合#def func(x, a, b,c):#    return a*np.sqrt(x)*(b*np.square(x)+c)#用3次多项式拟合,可推广到n次多项式,数学上可以证明,任意函数都可以表示为多项式形式#f1 = np.polyfit(x, y, 3)#p1 = np.poly1d(f1)#yvals = p1(x)  #拟合y值#也可使用yvals=np.polyval(f1, x)

拟合,并对参数进行限制,bounds里面代表参数上下限,p0是初始范围,默认是[1,1,1]
x=np.arange(1,206,1)
num = []<-自己的y值
numhunt = []<-自己的y值
y = np.array(num)
yhunt = np.array(numhunt)
popt, pcov = curve_fit(func3, x, y)
popthunt, pcovhunt = curve_fit(func, x, yhunt,p0=[2,2,2]) 
ahunt = popthunt[0]uhunt = popthunt[1]sighunt = popthunt[2]
a1 = popt[0]u1 = popt[1]sig1 = popt[2]a2 = popt[3]u2 = popt[4]sig2 = popt[5]a3 = popt[6]u3 = popt[7]sig3 = popt[8]
yvals = func3(x,a1,u1,sig1,a2,u2,sig2,a3,u3,sig3) #拟合y值yhuntvals = func(x,ahunt,uhunt,sighunt) #拟合y值
print(u‘系数ahunt:‘, ahunt)print(u‘系数uhunt:‘, uhunt)print(u‘系数sighunt:‘, sighunt)
#绘图plot1 = plt.plot(x, y, ‘s‘,label=‘insect original values‘)plot2 = plt.plot(x, yvals, ‘r‘,label=‘insect polyfit values‘)plot3 = plt.plot(x, yhunt, ‘s‘,label=‘predator original values‘)plot4 = plt.plot(x, yhuntvals, ‘g‘,label=‘predator polyfit values‘)
plt.xlabel(‘date‘)plt.ylabel(‘Nightly catches log10(N+1)‘)plt.legend(loc=4) #指定legend的位置右下角plt.title(‘insect/predator‘)plt.show()
下图是单个和多个高斯拟合图像


下图是多项式拟合图像

图例的位置可以自定义设置

lower left
upper center
lower right
center
upper left
center left
upper right
lower center
best
center right
right

原文地址:https://www.cnblogs.com/marszhw/p/10962877.html

时间: 2024-08-07 19:33:19

python 拟合曲线并求参的相关文章

python中的无参装饰器和有参装饰器

python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3>.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器对象的调用方式的前提下为其扩展新功能: 4>.装饰器本质是函数,(即装饰其他函数)就是为其他函数添加附加功能. 一.典型装饰器案例 1 #!/usr/bin/env pyth

python入门:求1-2+3-4+5...99的所有数的和

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #求1-2+3-4+5...99的所有数的和 4 """ 5 给start赋值为1,sum赋值为0,当start的赋值小于100的时候while循环为真 6 temp的赋值等于start和2的余数,如果temp的赋值等于1,sum的赋值就等于 7 sum加start的赋值(余数为1,start就是奇数),否则sum的赋值就等于sum减start的 8 赋值(余数不为1就为0,

初识python 函数(定义,传参,返回值)

python基础(二): 菜鸟教程基础知识讲解的非常全面,内容选择我认为的重点输出一遍 函数: 定义一个函数: 你可以定义一个由自己想要功能的函数,以下是简单的规则: def fun(arg): pass return arg # 函数调用语法 fun(arg) arg:argument,参数(也叫prarmeter) ,任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. def:define,定义,创建函数 ,函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()

python 命令行传参

import sys 脚本名:sys.argv[0] 参数1:sys.argv[1] 参数2:sys.argv[2] 命令行选项: 1.通过-i -o选项来区别参数是输入文件还是输出文件.>>> python convert.py -i inputfile -o outputfile2.当不知道convert.py需要哪些参数时,用-h打印出帮助信息>>> python convert.py -h敲命令:t.py arg1 arg2

Python 中函数传参是传值还是传引用

直接简单的例子: 1 from ctypes import * 2 import os.path 3 import sys 4 5 def test(c): 6 print "test before " 7 print id(c) 8 c+=2 9 print "test after +" 10 print id(c) 11 return c 12 13 def printIt(t): 14 for i in range(len(t)): 15 print t[i]

python练习实例---求天数

输入某年某月某日,判断这一天是这一年的第几天? #!/usr/bin/env python # -*- coding:utf -8 year = int(raw_input("输入年份: ")) month = int(raw_input("输入月份: ")) day = int(raw_input("输入日子: ")) months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334

Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)

使用过hashlib库的朋友想必都遇到过以下的错误吧:“Unicode-objects must be encoded before hashing”,意思是在进行md5哈希运算前,需要对数据进行编码.而且在不同版本的Python下还有所不同,唉Python还需努力啊,接口和消 息都很不稳定. hashlib.md5(data)函数中,data参数的类型应该是bytes.也就是说我们在进行hash前必须把数据转换成bytes类型,对于C程序而言似乎没有类似问题,指针强制转换就OK了. 对于中文,

python入门:求1-2+3-4+5...99的所有数的和(自写)

1 #!/usr/bin/env pyhton 2 # -*- coding:utf-8 -*- 3 #求1-2+3-4+5...99的所有数的和(自写) 4 """ 5 给x赋值为0,给y赋值为0,while真,循环开始 6 如果x和2的余数等于0,那么x就为偶数,y的赋值就等于y减去x 7 否则x就为奇数,y的赋值就等于y加x 8 如果x等于100了,break跳出当前循环,x的赋值等于x加1一直循环到x等于100 9 打印y 10 """

python脚本4_求1到5阶乘之和

#求1到5阶乘之和 # a = 1 sum = 0 for i in range(1,6): a = i*a sum = sum+a print(sum) 原文地址:https://www.cnblogs.com/KunGe-13/p/10203120.html