- 2019-05-13 05:47:58
在数据处理中, 有时我们需要根据拟合参数的误差计算相应变量的误差, 也就是计算误差传播. 对于简单的模型, 计算比较简单, 可以手动完成; 对于复杂的模型, 涉及导数的计算, 处理起来就有点麻烦, 还容易出错. 所以我觉得还是找个比较统一的处理方法才好. 想了一下, 我们需要使用能够进行符号计算的程序, 也就是能够处理公式的程序, 而不仅仅是计算数值. 常用的符号处理程序有mathematica, maple, maxima, matlab, 虽然都能用, 但都太笨重了, 不适合用于处理这么简单的问题. 就想起很老的一个符号计算器EigenMath. 看来一下, 这个程序的Windows版已经不再更新了, 只有一个很老的版本还在网上流传. 不过网站上也提供了源码, 可以自己编译.
下面是一个处理的代码和例子
拟合的模型为
\[y=f(T, P_1, P_2, P_3, P_4)= P_1 - {P_2 \over T} \exp({P_3 \over T^2+P_4})\]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.6388
P2=56542
P3=352754
P4=2932.55
# 拟合误差
dP1=0.1013
dP2=65.08
dP3=349
dP4=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库比较多了, 随便看到的几个似乎都可以