复杂误差传播的计算

类别:    标签: 数理 编程   阅读次数:   版权: (CC) BY-NC-SA

在数据处理中, 有时我们需要根据拟合参数的误差计算相应变量的误差, 也就是计算误差传播. 对于简单的模型, 计算比较简单, 可以手动完成; 对于复杂的模型, 涉及导数的计算, 处理起来就有点麻烦, 还容易出错. 所以我觉得还是找个比较统一的处理方法才好. 想了一下, 我们需要使用能够进行符号计算的程序, 也就是能够处理公式的程序, 而不仅仅是计算数值. 常用的符号处理程序有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库比较多了, 随便看到的几个似乎都可以

◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: GROMACS分析教程:水分子序参数的计算
后一篇: 野马, 草原, 我

访问人次(2015年7月 9日起): | 最后更新: 2024-04-16 06:38:20 UTC | 版权所有 © 2008 - 2024 Jerkwin