|
2019-05-13 05:47:58
在数据处理中, 有时我们需要根据拟合参数的误差计算相应变量的误差, 也就是计算误差传播. 对于简单的模型, 计算比较简单, 可以手动完成; 对于复杂的模型, 涉及导数的计算, 处理起来就有点麻烦, 还容易出错. 所以我觉得还是找个比较统一的处理方法才好. 想了一下, 我们需要使用能够进行符号计算的程序, 也就是能够处理公式的程序, 而不仅仅是计算数值. 常用的符号处理程序有mathematica, maple, maxima, matlab, 虽然都能用, 但都太笨重了, 不适合用于处理这么简单的问题. 就想起很老的一个符号计算器EigenMath. 看来一下, 这个程序的Windows版已经不再更新了, 只有一个很老的版本还在网上流传. 不过网站上也提供了源码, 可以自己编译.
下面是一个处理的代码和例子
拟合的模型为
y=f(T,P1,P2,P3,P4)=P1−P2Texp(P3T2+P4)
error.eigenmath | |
---|---|
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 31 32 33 34 35 36 37 38 39 40 41 | # 定义拟合函数f(T, P1, P2, P3, P4)= P1 - (P2/T)*exp(P3/(T^2+P4))# 最终误差的计算根据需要, 可以采用任意一种# 误差计算方法1: 简单方法f1=d(f,P1) # 计算对每个参数的导数f2=d(f,P2) f3=d(f,P3) f4=d(f,P4) df(x,P1,P2,P3,P4 dP1, dP2, dP3, dP4)=sqrt( (f1*dP1)^2+(f2*dP2)^2+(f3*dP3)^2+(f4*dP4)^2 )# 误差计算方法2: 使用梯度, 数组g=d(f,(P1, P2, P3, P4)) # 梯度d=(dP1, dP2, dP3, dP4) # 各个参数的误差a=zero(4)for(i,1,4, a[i]=g[i]*d[i]) DeltaF1=abs(a) DeltaF1# 误差计算方法3: 使用数组方法for(i,1,4, g[i]=g[i]^2, d[i]=d[i]^2) # square DeltaF2=sqrt(dot(g,d)) DeltaF2# 给定参数的拟合值P1=45.6388P2=56542P3=352754P4=2932.55# 拟合误差dP1=0.1013dP2=65.08dP3=349dP4=81.57# 输出结果#for(i,0,9,T=400+i*25, print(T,float(df(T,P1,P2,P3,P4 dP1, dP2, dP3, dP4))) )for(i,0,1,T=400+i*25, print(float(DeltaF2)) ) |
可以考虑利用js的符号处理库将其改为在线工具, 可以利用的js库比较多了, 随便看到的几个似乎都可以
◆本文地址: https://jerkwin.github.io/2019/05/13/复杂误差传播的计算/, 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 10:14
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社