科学网

 找回密码
  注册

tag 标签: 拟合

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

用Python对EP蒸气压数据进行回归
dingsir 2020-2-24 11:36
最近学习了一下Python,发现用Python也可以按指定的方程,用最小二乘法来拟合曲线,精度相当不错。代码是从他处学习来的,稍作改动以适应我的例子需要。下面的数据是丙酸乙酯的蒸气压数据,从手册查的。 运行的结果如下,精度不错。 这种作法的好处是不必使用复杂的origin或matlab等大型软件,用一个python加上几个库就可以使用,做出了Excel不便拟合的结果,备忘下。
个人分类: 软件杂谈|2260 次阅读|0 个评论
数值逼近Python程序
cambaluc 2019-10-17 20:15
插值,三次样条,拟合一锅烩: #interpolate_fit ,kangjian20191016 import numpy as np from scipy.interpolate import spline from scipy.interpolate import interp1d import matplotlib.pyplot as plt x=np.array( ) y=np.array( ) xx=np.linspace(0,20,80) f1=interp1d(x,y) f2=interp1d(x,y,kind='quadratic') f3=interp1d(x,y,kind='cubic') f,ax=plt.subplots(2,2) ax .plot(x,y,'o',xx,f1(xx),'.') ax .plot(x,y,'o',xx,f2(xx),'-') ax .plot(x,y,'o',xx,f3(xx),'-') sp=spline(x,y,xx) ax .plot(x,y,'o',xx,sp,'.') #plt.savefig('fit1.png',dpi=400,bbox_inches='tight') plt.show() plt.scatter(x,y,label='点') poly1= np.polyfit(x, y, deg = 1) plt.plot(xx, np.polyval(poly1, xx),'.',label='1次') poly2= np.polyfit(x, y, deg = 2) plt.plot(xx, np.polyval(poly2, xx),'.',label='2次') poly3= np.polyfit(x, y, deg = 3) fun=np.poly1d(poly3)##poly1d plt.plot(xx, fun(xx),color='r',label='3次') plt.legend(loc='best') #plt.savefig('fit2.png',dpi=400,bbox_inches='tight') plt.show() 最佳平方逼近,按原理 # -*- coding: utf-8 -*- Created on Thu Oct 17 11:11:00 2019 @author: kangjian import numpy as np import matplotlib.pyplot as plt x=np.array( ) y=np.array( ) def fi0(x): return x*0+1 def fi1(x): return x def fi2(x): return np.sin(x) G=np.matrix(( , )) b=np.matrix(( , )) a=np.linalg.solve(G,b) print(a) xx=np.linspace(1,6,100) plt.scatter(x,y) fun=a *fi0(xx)+a *fi1(xx) plt.plot(xx, fun,'.',color='r') G=np.matrix(( , , )) b=np.matrix(( , , )) a=np.linalg.solve(G,b) print( ,a ,a ]) fun2=a *fi0(xx)+a *fi1(xx)+a *fi2(xx) plt.plot(xx, fun2,'.',color='b') #plt.savefig('fit3.png',dpi=400,bbox_inches='tight') plt.show() 同样的数据,直接调函数 import numpy as np import matplotlib.pyplot as plt x=np.array( ) y=np.array( ) xx=np.linspace(1,6,100) plt.scatter(x,y) mypoly= np.polyfit(x, y, 1) plt.plot(xx, np.polyval(mypoly, xx),'.',color='r') mypoly2= np.polyfit(x, y, 2) plt.plot(xx, np.polyval(mypoly2, xx),'.',color='g') mypoly3= np.polyfit(x, y,3) fun=np.poly1d(mypoly3)#函数形式 plt.plot(xx,fun(xx),'.',color='b') #print(mypoly) plt.savefig('fit4.png',dpi=400,bbox_inches='tight') plt.show()
个人分类: Python|0 个评论
如何拟合加轨道倾角的O-C图
dabing 2019-7-30 11:21
背景: 由于光时轨道效应,脉动变星的 O-C 图会有类似正弦的变化,在拟合过程中,会用考虑到轨道倾角的因素(sin i) 问题: 如何加入sin i 这一项来拟合呢? 另: Oscillation modes: by a standard Fourier analysis of light curve . method: Period04 The main oscillation mode is ... and the second mode is ...., then the two oscillation mode were used to fitted the light curve . Reference: Jafarzadeh, S. J. 2017 New Astronomy. 2019. 07. 30
个人分类: 工作日记|2 次阅读|0 个评论
一个能够考虑系统误差的用于高能物理分类问题的机器学习算法QBDT
xialigang 2019-3-28 22:41
机器学习有很多应用。在我们高能实验物理方面,我们经常用它能区分信号和本底。一个典型的问题是,高能物理实验会涉及很多系统误差(特别是在像LHC这样的强子对撞机上寻找微小的信号),而这些系统误差会影响对信号的灵敏度。但是目前,还没有一个成熟的机器学习方法可以把各种各样的系统误差考虑到training当中,并提高信号的显著性。为此,我提出了一种新的基于决策树( decision tree )和统计学里面的“显著性( significance )”概念的方法——QBDT (即将在NIMA上发表)。 算法: https://github.com/xialigang/QBDT 文章: https://arxiv.org/abs/1810.08387 它的核心思想是:把信号显著性(记作Q)当成优化目标,利用Q来控制决策树的生长,定义误判的权重因子(所谓错误判断的惩罚机制),以及作为最后的输出(score)。在计算Q时,我们可以把各种各样的系统误差考虑进去。直接利用最大似然拟合方法得到Q是非常费时费力的。这里利用我以前的一个 计算结果 ,可以得到考虑系统误差的Q的一个近似的解析表达式。 其中 的表达式为 这里很多量不解释了,请参考上面的文章。
个人分类: 物理妙趣|2905 次阅读|0 个评论
OriginPro2015 精要例解(一)
热度 1 yiking 2015-1-29 00:40
非线性曲面拟合好像比较复杂,先拟合一个平面比较容易上手。用z=x+y生成数据进行拟合,  拟合结果对不对一目了然。 Nonlinear Surface Fit (Plane) Jinsheng Xiao 2015-1-28.pdf Plane.opj
1788 次阅读|2 个评论
高斯非线性最小二乘法(全局优化)拟合
热度 1 zhanghouxing 2015-1-10 17:41
高斯拟合属于非线性拟合,这里最小二乘法,全局最优拟合方法为例,写一个代码,供大家参考: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 close all; clear all; clc; %% Pharmacokinetic Data t = -10:0.2:10; %#ok*NOPTS c = 5*exp(-((t)/4).^2)+randn(size(t))*0.1; plot(t,c,'o'), xlabel('t'), ylabel('c');hold on %% 3 Compartment Model model = @(b,t) (b(1)+b(2)*exp(-((t-b(3))./b(4)).^2)) %% Define Optimization Problem problem = createOptimProblem('lsqcurvefit', 'objective', model, 'xdata', t, 'ydata', c, 'x0',ones(1,4)) % 'lb', ,'ub', ,'options',optimset('OutputFcn', @curvefittingPlotIterates) %% solve % b = lsqcurvefit(problem) %Direct fitting may lead to local optimum %% Multistart ms = MultiStart('PlotFcns',@gsplotbestf) = run(ms, problem, 100) %#ok*NASGU,*ASGLU %% figure; plot(t,c,'o'), xlabel('t'), ylabel('c');hold on hold on; xfdata=-10:0.2:10; yfdata= b(1)+b(2)*exp(-((xfdata-b(3))./b(4)).^2); plot(xfdata,yfdata,'r') hold off; (1)迭代过程 (2) 拟合结果 注:18行代码,为直接用最小二乘法拟合,但这种方法往往只能找到局部最优。 转载请注明: 笑凌子 » 高斯非线性最小二乘法(全局优化)拟合
8918 次阅读|1 个评论
[转载]pwscf的物态方程拟合模块ev.x
plgongcat 2014-9-15 19:31
标签: ev.x 状态方程 体积-能量 分类: pwscf 体积-能量曲线 times_a2V.f90 的获得可以拟合状态方程, 得到平衡体积或晶格常数以及最低能量 ;PWscf提供了这个功能:) 但目前仅能处理 fcc,bcc, sc, hex这四种体系 由于不同固体的热力学特性差别较大 ,长期以来人们普遍认为,不同固体根据其微观热力学特性而建立的物态方程应具有各自独特的形式,因此人们一般采用不同的函数形式,对不同类型固体的物态方程加以描述。近几十年来,已经提出和建立了许多半经验半理论解析形式的物态方程:第一种是在弹性变形理论基础上导出的有限应力2应变关系,其中最著名的是Murnaghan物态方程和Birch 物态方程,它们是从体积模量或弹性应变能对压力或应变的二阶或三阶Taylor展开式中推导而出的;第二种是针对不同类型固体材料提出不同能量模型,以建立相应的物态方程 ,根据Born-Meyer势BM和Morse势建立的零温物态方程等。 文章来源 http://old.blog.edu.cn/user1/11542/archives/2007/1663390.shtml 一:状态方程 pwscf提供了状态方程拟合模块ev.x,能采用四种不同的状态方程函数对所计算的V-E或a-E进行拟合。这四种状态方程为: 1. Birch 状态方程 当只考虑一阶时a_2=0;考虑二阶时,二阶如上的表达式。 (Birch F 1938 J. Appl. Phys.9 279; Birch F 1947 Phys.Rev. 71 809) 2.Keane状态方程 这里x=V/V_0; K _0是体弹性模量,也就是B_0; K ’ _infinit是 K ’ 在 P- infinit时的值。 (Keane A 1953 Nature 172 117;Keane A 1954 Aust.J. Phys. 7 322;J. Shanker, B.P. Singh, A comparative study ofKeane’s and Stacey’s equations of state, Physica B 370 (2005)78–83) 3. Murnaghan状态方程 Murnaghan F D 1967 Finite Deformation of an Elastic Solid (NewYork: Dover) 一篇比较全而新的文献: Papiya Bose Roy and Sushil Bose Roy, Applicability of isothermalthree-parameter equations of state of solids—areappraisal, J . Phys: Condens. Matter 17 (2005)6193–6216 二:P Wscf中ev.x使用说明 1.准备体积-能量输入文件。 a.对 非 立方晶系 体积(单位为a.u.^3) 能量值(单位为Ry) 这是两列数 b.对立方晶系(简单立方sc,面心立方fcc或体心立方bcc) 晶格常数(单位为a.u.) 能量值(单位为Ry) 2. 运行ev.x 按提示输入选择: Enter type of bravais lattice (fcc, bcc, sc, hex) Enter type of equation of state : 1=birch1, 2=birch2, 3=keane, 4=murnaghan Input file Output file 第一个是要选择晶系,当选择fcc,bcc或sc时,准备的输入文件是按晶格常数--能量来给出。此时只能输入fcc、bcc、sc或者hex字符 第二个是选择采用什么状态方程来拟合。 第三个是要告诉你计算的数据(a-E 或V-E)是放在哪个文件中。 第四个是要告诉拟合出来的数据放到哪个文件中。 3.ev.x的输出结果 例子: # equation of state: birch 1st order. chisq = 0.2466D-08 # V0 = 212.85 k0 = 359 kbar, dk0 = 3.68 d2k0 = 0.000 emin =-32.10745 178.08 -32.09828 -32.09831 88.90 0.00003 183.79 -32.10144 -32.10137 69.07 -0.00007 第一行说明采用什么函数形式去拟合,以及拟合的误差(chisq是平方根误差值) V0或者a0就是拟合出来的平衡态(在极小值时)时的体积或晶格常数。 k0就是拟合出来的体弹性模量 k0就是体弹性模量对体积的一阶偏导,d2k0是体弹性模量对体积的二阶偏导 emin就是在平衡态时的能量,也就是能量极小值。 之后的第一列数据是输入的体积(或晶格常数),第二列是输入的能量,第三列是拟合的能量,第四是拟合出的压强,第五列是误差值(输入的能量减去拟合出的能量)。 补记: Instruction of /pwtools/ev.f90file Input data file format for cubicsystems: a0(1) Etot(1) ... a0(n) Etot(n) Input data file format forhexagonal systems: V0(1) Etot(1) ... V0(n) Etot(n) where V0(i) = sqrt(3)/2 * a^2 *c is the unit-cellvolume Etot(i)= min Etot(c) for the given volume V0(i) V0, a0, etot in atomic (Rydberg) units ; bulkmodulus in kbar Output datafile format for cubic systems: a0(1) Etot(1) Efit(1) Pfit(1) Etot(1)-Efit(1) ... a0(n) Etot(n) Efit(n) Pfit(n) Etot(n)-Efit(n) Output datafile format for hexagonal systems: V0(1) Etot(1) Efit(1) Pfit(1) Etot(1)-Efit(1) ... V0(n) Etot(n) Efit(n) Pfit(n) Etot(n)-Efit(n) where Efit isthe fitted value from the EOS Pfit is the correspondingpressure from the EOS 我的测试: BN-doped Graphene (hex)3*3 supercell 1.得到数据(a—E) #a/Ang E/Ry 7.3878 -208.27845 7.4617 -208.27755 7.3693 -208.27595 7.3500 -208.27214 7.3900 -208.27868 转换数据(V—E) ps(times_a2V.f90) #V/Ang 3 E/Ry 472.65927 -208.27844 482.16254 -208.27756 470.29498 -208.27596 467.83484 -208.27214 472.94077 -208.27869 2. ev.x Fitting # equation of state: birch 1st order. chisq = 0.7768D-10 # V0 = 3218.06 a.u.^3, k0 = 1970 kbar, dk0 = 4.79 d2k0 = 0.000 emin = -208.28016 # V0 = 476.87 Ang^3, k0 = 197.0 GPa ########################################################################## #Vol. E_calc E_fit E_diff Pressure Enthalpy # Ang 3 Ry Ry Ry GPa Ry ########################################################################## 472.66 -208.27844 -208.27845 0.00001 1.78 -207.89173 482.16 -208.27756 -208.27756 0.00000 -2.12 -208.74625 470.29 -208.27596 -208.27596 -0.00000 2.83 -207.66620 467.83 -208.27214 -208.27214 0.00000 3.94 -207.42576 472.94 -208.27869 -208.27868 -0.00001 1.66 -207.91826 (ps: H=U+PV,e.g. -207.89173=-208.27845+1.78*472.66*4.60*10 -4 ) 3. gnuplot $plot ./birch1.out2 u 1:2 smooth unique w lp, -208.28016+197*(476.87-x+x*log(x/476.87))* 4.6*10**(-4) 状态方程:birch http://wenku.baidu.com/link?url=pQV3CB7LxNyk1xURckNA6TFjjslrNYu4drpAzuFIPNWGfIHSTv0qj-q_yn2IF78G1Ou405XuMrmzwvFQZE-QAMDwiltBRZWAOyMCIhGRzm7
个人分类: pwscf|2063 次阅读|0 个评论
绳链实验里的一点简单计算
热度 9 hailanyun0415 2014-4-9 21:18
在 桌面比萨斜塔实验与绳链中的反楞次定律 里 13楼回复时好像把时间算错了,没开方。 在 @刘全慧:“长链”同学,请公平竞赛! 里 16楼 做了 回复后,本来想画个图的,不过 在 一句话解释链子比小球下落得快 里已经画了,我就做点简单的计算吧。 首先,小球肯定是自由落体,落了1.668m,取g=9.8,可以算出t=0.58s。 假设16张照片是等时差拍摄,那么每张相差0.039s。 不过测量时估计不会取0.58、0.039这种不好 测 也不好 算 的数字,有可能取t=0.6s,每张照片相差0.04s。 链子放手一瞬间顶端链结除了受到重力,还有下方巨大的拉力,因此一瞬间有很大的加速度,能在这一瞬产生一定的速度。这个速度要多大才能引起0.6s后0.23m的差距呢?算出来为0.38m/s,算成0.4m/s也可以。 问题1:那个巨大的加速度会有多大? 链子长1.898m,估计每节链结0.02m是有的,那么放手一瞬间,最上方链结所受拉力为自己重力的95倍左右,加速度为95g(实际上可能更小)。 问题2: 那个巨大的加速度作用的时间会有多久? 假设力的传播速度为声速的3倍约1000m/s好了(实际上可能更快吧),距离为0.02m,大概需要0.00002s。 初速为0,知道加速度和时间,可以算出末速度为0.019m/s,远小于0.4m/s。 从计算结果来看开始的巨大加速度导致铁链顶端有初速度不是铁链比小球更快下落的主要原因。估计那篇论文的作者早就算过了也不一定。 0.4m/s会不会是手抖造成的呢?松铁链时不小心往下送了一下,给了 铁 链顶端 一个初速度?这个实验肯定不止做了一次,如果手抖能产生这么大的影响,应该不仅仅只影响铁链,小球也会受影响。如果多次实验没有出现小球先落地的情况,手抖导致铁链有初速度的可能性就可以排除。 另外,我还做了几张图,没什么有意义的发现,把我的失败经验分享给大家吧: 1.铁链并不是垂直释放的,第一张照片中铁链与垂直方向有0.5度的夹角。不过整个过程铁链应该会摇摆,就算一开始严格垂直了,过个零点几秒估计也还是会偏了。图1是左上角有红圈的那块地方放大后的情况,红线为垂线,蓝线为链条位置。 2.轨迹拟合失败。图2中蓝色线为 , 红色线为 , 黄色线为 (假设铁链顶端做匀加速直线运动算出来的加速度就是 11.2,大于9.8 ) 我这种拟合其实无非也就是把函数图变透明然后往原图上凑啦。虽然蓝线不应该是铁链顶端的方程,但貌似符合得很好,反倒是小球似乎不是做自由落体运动一般。 蓝线往上拖一下,居然和小球的位置也 凑上了。 链条顶端估计不是匀加速直线运动,怎么凑都凑不上。不过自由落体的小球都凑不上,这些图估计也没什么价值。
个人分类: 其他|8041 次阅读|53 个评论
样条函数插值拟合
Jerkwin 2014-3-13 03:43
样条函数插值拟合 2014–02–11 09:26:49 在拟合势能函数的时候, 除解析式外, 也可以利用样条函数进行拟合. 样条拟合与其插值正好相反: 已知函数在节点上的值求任意位置的值, 做插值; 已知函数的某些组合值求函数节点上的值, 属于拟合. 由于样条函数可以化为节点函数值的线性表达式, 这样就可以将待求参数线性化, 得到最优情况下函数的形状, 为寻找合适的解析式提供依据, 当然也可以直接利用得到的离散数据拟合解析式. 样条函数可以是零阶, 一阶, 二阶, 三阶或更高阶. 实际使用中, 三阶使用最为普遍. 由于三次样条的构造需要求解一个三对角线性方程组, 其显式解很难得到, 所以线性化结果很繁琐. 零阶 在每一区间上样条函数为常量, 函数整体呈台阶状. 对等距情况, 计算时最好使用就近原则, 取最近点的值作为拟合点, 可用 i=nint(x/dx) 实现. 一阶 在每一区间上样条函数为线性函数, 函数整体呈折线状$.$ f i ( x ) = y i + y i + 1 − y i Δ x ( x − x i ) 此式自动满足函数值连续条件, 即零阶连续. 二阶 在每一区间上, 样条函数为二次函数, 整体一阶连续, 即有连续的导数. 但仅有节点的函数值不能唯一确定整个函数, 还须提供某一节点上的导数值, 一般可令端点的导数值为零. 二次样条函数在偶数点的曲率不连续. 由二阶开始, 插值函数不再具有局域性, 改变某一节点, 函数整体都会改变. 使得线性系数分离很困难. f i ( x ) k i + 1 = y i + k i ( x − x i ) + k i + 1 − k i 2 Δ x ( x − x i ) 2 = − k i + 2 y i + 1 − y i Δ x , k i = 2 y i + 1 − y i Δ x − k i + 1 可化简得 f i ( x ) α = y i + k i ( x − x i ) + ( y i + 1 − y i − k i Δ x ) ( x − x i Δ x ) 2 = α 2 y i + 1 + ( 1 − α 2 ) y i + ( 1 − α ) ω k i = ω / Δ x , ω = x − x i 对势能函数, 一般满足远距离处导数为零, 故可使用自然条件 k n = 0 , 由此, 可推知所有系数 k i . 令 k i = 2 Δ x T i , Δ i = y i + 1 − y i , 则 T i 满足递推式 T i = Δ i − T i + 1 可求得 T i = ∑ j = i n − 1 ( − 1 ) j − i Δ j 样条函数可写为 f i ( x ) = α 2 y i + 1 + ( 1 − α 2 ) y i + 2 α ( 1 − α ) T i , α = ( x − x i ) / Δ x 对不等距划分, 令 Δ i = y i + 1 − y i x i + 1 − x i , k i 满足如下递推式 k i = 2 Δ i − k i + 1 求得 k i = 2 ∑ j = i n − 1 ( − 1 ) j − i Δ j 三阶 对等距划分的均匀样条, 设节点为 1 , 2 , . . . . n , 若 x ∈ , a = x − x i , b = x i + 1 − x , a + b = h = Δ x , 则 6 h f i ( x ) = 6 ( a y i + 1 + b y i ) + a ( a 2 − h 2 ) M i + 1 + b ( b 2 − h 2 ) M i M i 为节点的二阶导数, 对应于力学上的弯矩, 满足下面的方程 M i + 4 M i + 1 + M i + 2 = d i + 1 = 6 h 2 ( y i + 2 − 2 y i + 1 + y i ) , i = 1 , 2... n − 2 要求的 M i 个数为 n , 而对应的方程数目为 n − 2 , 故还需两个边界条件才能唯一确定, 边界条件可取为两端点的导数值或是二阶导数值. 常用的自然边界条件指 M 1 = M n = 0 . 加上边界条件后便可求得 M 2 , M 3 , . . . M n − 1 M i 满足的方程为 0 M 2 M 3 ⋮ M n − 3 M n − 2 + + + ⋮ + + 4 M 2 4 M 3 4 M 4 ⋮ 4 M n − 2 4 M n − 1 + + + ⋮ + + M 3 M 4 M 5 ⋮ M n − 1 0 = = = ⋮ = = d 2 d 3 d 4 d n − 2 d n − 1 写为矩阵形式 ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ 4 1 ⋮ … … 1 4 ⋮ 1 0 0 1 ⋮ 4 1 … … ⋮ 1 4 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ M 2 M 3 ⋮ M n − 2 M n − 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ d 2 d 3 ⋮ d n − 2 d n − 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ 可见, 此方程为三对角方程组, 对角占优, 存在唯一解, 可利用所谓的追赶法求解. 中文常称的追赶法, 是 Thomas方法 的形象翻译. 大致求解过程分为两步: 追: 利用消元法将原方程化为二对角方程, 向前递推, 使系数矩阵主对角线变为1. 由第一个方程, 得到 M 2 和 M 3 的关系, 将其带入第二个方程, 消去主对角线下方系数. 以此进行, 最终追到 M n − 1 , 得到其解. 变换后, 其方程为 ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ 1 0 ⋮ … … A 2 1 ⋮ 0 0 0 A 3 ⋮ 1 0 … … ⋮ A n − 2 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ M 2 M 3 ⋮ M n − 2 M n − 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ D 2 D 3 ⋮ D n − 2 D n − 1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ 赶: M n − 1 已经追得, 然后由此倒推, 得到其他 M i 值. 对上面的方程, 由于系数是固定的, Thomas方法的递推式为 A 2 D 2 M n − 1 = 1 4 , = A 2 d 2 , = D n − 1 , A i D i M i = 1 4 − A i − 1 = A i ( d i − D i − 1 ) = D i − A i M i + 1 对 A i , 可求得其通式 A i = 2 − 3 √ t i + 1 t i − 1 , t = ( 2 + 3 √ ) 2 对 D i , 向后递推至 D 2 , 一般项可写为 D j = ∑ k = 2 j ( − 1 ) j − k P j k d k 对 M i , 向前递推至 M n − 1 , 一般项可写为 M i = ∑ j = i n − 1 ( − 1 ) j − i P j − 1 i D j 综合上面两个结果, 得到 M i P n m = ∑ j = i n − 1 ∑ k = 2 j ( − 1 ) 2 j − i − k P j − 1 i P j k d k = ∑ j = i n − 1 ∑ k = 2 j ( − 1 ) i + k P j − 1 i P j k d k , i = 2 , 3 , . . . n − 1 = ∏ l = m n A l = A m A m + 1 … A n − 1 A n , n m 根据插值公式 d k 6 h f i ( x ) = 6 h 2 ( y k + 1 − 2 y k + y k − 1 ) = 6 ( α y i + 1 + β y i ) + α ( α 2 − h 2 ) M i + 1 + β ( β 2 − h 2 ) M i 以划分间距 h 为单位, 约化上述公式 f i ( x ) α = α y i + 1 + β y i + α ( α 2 − 1 ) μ i + 1 + β ( β 2 − 1 ) μ i = a h , β = b h = 1 − α , μ i = M i 6 / h 2 由此可见, 虽然三次样条函数仍可写为节点值的线性形式, 但其系数十分复杂. 上面公式看起来清楚, 但是实际计算时需要计算 M i 和 M i + 1 , 两个三重循环, 整体计算量为 O ( N 3 ) . 利用 A i 的近似关系和 M i 的递推关系可以将公式的计算量减少一些. f i ( x ) = α y i + 1 + β y i + α ( α 2 − 1 ) μ i + 1 + β ( β 2 − 1 ) μ i = α y i + 1 + β y i + β ( β 2 − 1 ) D i + μ i + 1 对不等距划分, 上面的递推公式太过复杂, 很难写出一般项了. 样条函数可写为 f i ( x ) h i = a y i + 1 + b y i h i + a ( a 2 − h 2 ) M i + 1 + b ( b 2 − h 2 ) M i 6 h i = x i + 1 − x i , a = x − x i , b = h i − a M i 满足方程 h i M i + 2 ( h i + h i + 1 ) M i + 1 + h i + 1 M i + 2 = 6 ( y i + 2 − y i + 1 h i + 1 − y i + 1 − y i h i ) , i = 1 , 2 , … , n − 2 代码及测试测试结果 awk 实现的代码如下 awk ' BEGIN { Ndat = 0 } NF = = 3 { Ndat + + ; X = $ 2 ; Y = $ 3 } END { for ( i = 1 ; i Ndat ; i + + ) dX = X - X for ( i = 2 ; i Ndat ; i + + ) d = 6 * ( ( Y - Y ) / dX - ( Y - Y ) / dX ) A = 0 ; A = 0 D = 0 ; D = 0 for ( i = 2 ; i = Ndat - 1 ; i + + ) { ai = dX bi = 2 * ( dX + dX ) ci = dX A = ci / ( bi - ai * A ) D = ( d - ai * D ) * A / ci } M = 0 for ( i = Ndat - 1 ; i 1 ; i - - ) M = D - A * M # for ( i = 1 ; i = Ndat ; i + + ) print i , dX , d , A , D , M h = X - X for ( x = X ; x X ; x + = . 1 * h ) print x , SP 2 ( x , 0 , Ndat , X , Y , dX ) , SP 3 ( x , 0 , Ndat , X , Y , dX , M ) } function SP 2 ( x , i , Ndat , X , Y , dX , j , a , ki ) { if ( i = = 0 ) { for ( i = 1 ; i Ndat ; i + + ) if ( X x ) break } ki = 0 for ( j = i ; j = Ndat - 1 ; j + + ) ki + = 2 * ( - 1 ) ^ ( j - i ) * ( Y - Y ) / dX a = ( x - X ) / dX return a^ 2 * Y + ( 1 - a^ 2 ) * Y + ( 1 - a ) * ki * ( x - X ) } # function SP 3 ( x , i , Ndat , X , Y , dX , M , a , b , h ) { if ( i = = 0 ) { for ( i = 1 ; i Ndat ; i + + ) if ( X x ) break } h = dX a = x - X ; b = h - a return ( a * Y + b * Y ) / h + ( a * ( a^ 2 - h^ 2 ) * M + b * ( b^ 2 - h^ 2 ) * M ) / ( 6 * h ) } # function Psp 3 ( Ndat , i , j , k , a ) { a = ( 2 + sqrt ( 3 ) ) ^ 2 for ( i = 2 ; i Ndat ; i + + ) { for ( j = i ; j Ndat ; j + + ) { P = 1 for ( k = i ; k = j ; k + + ) P * = 2 - sqrt ( 3 ) * ( a^k + 1 ) / ( a^k - 1 ) } } } # function uniSP 3 ( x , i , Ndat , X , Y , j , k , a , b , h ) { if ( i = = 0 ) { for ( i = 1 ; i Ndat ; i + + ) if ( X x ) break } h = X - X a = ( x - X ) / h ; b = 1 - a for ( j = 1 ; j = Ndat ; j + + ) Coef = 0 Coef + = b Coef + = a Rsec = b * ( b^ 2 - 1 ) for ( k = 2 ; k = i ; k + + ) { Rtmp = Rsec * ( - 1 ) ^ ( i - k ) * P Coef + = Rtmp Coef + = - 2 * Rtmp Coef + = Rtmp } Rsec = a * ( a^ 2 - 1 ) - b * ( b^ 2 - 1 ) * P for ( j = i + 1 ; j = Ndat - 1 ; j + + ) { Rij = Rsec * ( - 1 ) ^ ( i + 1 ) if ( j ! = i + 1 ) Rij * = P for ( k = 2 ; k = j ; k + + ) { Rtmp = Rij * ( - 1 ) ^k * P Coef + = Rtmp Coef + = - 2 * Rtmp Coef + = Rtmp } } F = 0 for ( j = 1 ; j = Ndat ; j + + ) F + = Coef * Y return F # ( a * Y + b * Y + a * ( a^ 2 - 1 ) * Mi ( i + 1 , Ndat ) + b * ( b^ 2 - 1 ) * Mi ( i , Ndat ) ) } # function Mi ( i , Ndat , j , k , Rtmp , ret ) { ret = 0 for ( j = i ; j = Ndat - 1 ; j + + ) { Rtmp = ( - 1 ) ^i if ( j ! = i ) Rtmp * = P for ( k = 2 ; k = j ; k + + ) ret + = Rtmp * ( - 1 ) ^k * P * d } return ret } ' ABS ABS . sp # ' CUB CUB.sp #' LJ LJ.sp 利用Matlab的 csape 函数 可以进行三次样条函数的插值, 示例代码如下 format long x = 1 : 0 . 02 : 15 ; y = - 1 E 3 * ( - 12 . / x . ^ 13 + 6 . / x . ^ 7 ) ; pp = csape ( x , y , 'second' , ) ; pp = csape ( x , y ) ; xsp = 1 : 0 . 01 : 1 . 5 ; ysp = ppval ( pp , xsp ) ; yst = - 1 E 3 * ( - 12 . / xsp . ^ 13 + 6 . / xsp . ^ 7 ) ; plot ( x,y, 'o',xsp,ysp,'-',xsp,yst,'-' ) axis ( ) FID = fopen ( 'LJ.mat', 'w' ) ; Ndat = length ( xsp ) ; for i = 1 : Ndat fprintf ( FID , '%f %f\n' , xsp ( i ) , ysp ( i ) ) ; end 几个测试函数的结果 样条函数的积分 对已经拟合的样条函数进行数值积分时可利用可利用 Simpson方法 . Simpson方法具有三阶精度, 对不超过三次的多项式精确成立, 很适合于二次和三次样条函数.
个人分类: 数学轮子|7742 次阅读|0 个评论
怎样同时用2条直线去拟合同一组数据? 诚征答案!
热度 3 bigdataage 2013-11-14 11:05
怎样同时用2条直线去拟合同一组数据? 诚征答案! 比如数据的散点图是如下形式的: 实际的数据更多更复杂,不可能都去看一下它们的散点图, 散点图也没什么作用,已经确定要用 2条直线去拟合。 有没有什么一般的方法,同时用2条直线去回归拟合? 相当于自变量的一个值对应2个函数值,想了很久,无法用最小2乘法。 谁有办法? 以下方法请不要再说: 1. 会导致死循环的。 2. 计算量超大的。(需要动用天河的) 3. 需要手动处理的。(有几万个数据集需要处理。) 谢谢!
4653 次阅读|11 个评论
Origin 柱状图添加拟合曲线
热度 1 botar 2013-9-12 16:33
今天想在柱状图上添加拟合曲线,在网上找了很久,没有收获,最后自己用较笨的办法实现了,贴出来供参考,若今后找到更科学的方法再更新。 效果图如下: 实现步骤: 1.先做好柱状图 2.然后单独拟合coating-1,获得拟合曲线,调整线的颜色和粗细,再拷贝拟合曲线,粘贴到柱状图中,调整位置即可。 3.其他coating-2,3方法相同。 4.最后在柱状图中制作拟合曲线的Legend,排好位置,即可。 若有其他方法请教我,谢谢。
43062 次阅读|1 个评论
复杂性科学研究中常见分布律及数据拟合方法
热度 5 supermac 2012-8-12 15:46
以前总结的复杂网络和人类动力学研究中常见的分布律及拟合方法,挂在博客上方便取用,也欢迎各位同行指教! 目录: 基本术语英汉对照 常见的分布律 l 正态 / 高斯分布 Normal distribution / Gaussian distribution l 对数正态分布 Log-normal distribution l 指数 / 负指数分布 Exponential distribution / Negative exponential distribution l 泊松分布 Poisson distribution l 幂律分布 Power law distribution l 指数截断的幂律分布 Power law with exponential cutoff l 截断幂律 Truncated power law l 广延指数分布 Stretched exponential distribution l 漂移幂律 Shifted power law 数据拟合与参数估计(7步) 重要参考文献 常见分布律及数据拟合总结.docx
个人分类: 科研资料|13281 次阅读|11 个评论
谈谈gnuplot(二十四):拟合
yusufma 2011-11-9 09:05
gnuplot 除了绘图功能之外,最简单实用的功能就是拟合了。gnuplot 可以进行单变量甚至多变量的线性和非线性拟合。虽然可能不像专门的数学软件那么强大,但是足以对付日常需要了。我们拿上一篇文章里的数据来举例子。 首先,要定义一个待拟合的函数: gnuplot f(x)=50*(1+erf(a*(x-b))) 这里使用了误差函数 erf(x) ,有两个待定的参数: a, b 。下面我们生成一个文件“ fit.par ”,里面包含的是参数 a 和 b 的初值: a = 1 b = 12 初值的选择要尽可能贴近结果,否则可能导致误差甚至无法收敛。下面我们进行拟合: gnuplot fit f(x) 'probability.dat' using 1:2 via 'fit.par' gnuplot 里面关于拟合的命令是 fit ,后面的自变量取值范围不是必需的。 f(x) 函数已经在上面定义过了,数据文件“ probability.dat ”也已经在上一篇博文中交代过了。 via 后面跟的是参数变量列表文件。执行 fit 命令之后,gnuplot 会输出一堆结果。我们忽略那些中间运算,只把最后结果贴在下面: After 5 iterations the fit converged. final sum of squares of residuals : 41.9399 rel. change during last iteration : -4.27973e-07 degrees of freedom (FIT_NDF) : 8 rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 2.28965 variance of residuals (reduced chisquare) = WSSR/ndf : 5.24249 Final set of parameters Asymptotic Standard Error ======================= ========================== a = 1.15661 +/- 0.06331 (5.474%) b = 11.9027 +/- 0.02383 (0.2002%) correlation matrix of the fit parameters: a b a 1.000 b 0.014 2.000 这段文字说明,经过 5 次迭代,gnuplot 得到了收敛的结果。中间部分是参数 a 和 b 的最终取值以及渐近标准差(asymptotic standard error)。渐近标准差的计算是基于线性拟合的,对于非线性拟合,渐近标准差一般都比真的标准差小,所以这个数字只能用于定性分析。而最后给出的相关矩阵(correlation matrix)可以帮助我们确认渐近标准差的可靠度,非对角元素绝对值越小,渐近标准差越接近真实标准差。 好了,现在我们可以把数据和拟合曲线画在同一张图上了: gnuplot set xrange gnuplot set yrange gnuplot unset key gnuplot set xlabel "Laser Pulse Energy (μJ)" gnuplot set ylabel "Bubble Formation Probability (%)" gnuplot plot "probability.dat" using 1:2:3:4 with xerrorbars, f(x) lw 2 lc rgb "orange"
个人分类: 开源软件|11360 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 20:42

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部