Jerkwin分享 http://blog.sciencenet.cn/u/Jerkwin

博文

复杂误差传播的计算

已有 628 次阅读 2019-5-13 19:02 |系统分类:科研笔记

  • 2019-05-13 05:47:58

在数据处理中, 有时我们需要根据拟合参数的误差计算相应变量的误差, 也就是计算误差传播. 对于简单的模型, 计算比较简单, 可以手动完成; 对于复杂的模型, 涉及导数的计算, 处理起来就有点麻烦, 还容易出错. 所以我觉得还是找个比较统一的处理方法才好. 想了一下, 我们需要使用能够进行符号计算的程序, 也就是能够处理公式的程序, 而不仅仅是计算数值. 常用的符号处理程序有mathematica, maple, maxima, matlab, 虽然都能用, 但都太笨重了, 不适合用于处理这么简单的问题. 就想起很老的一个符号计算器EigenMath. 看来一下, 这个程序的Windows版已经不再更新了, 只有一个很老的版本还在网上流传. 不过网站上也提供了源码, 可以自己编译.

下面是一个处理的代码和例子

拟合的模型为

y=f(T,P1,P2,P3,P4)=P1P2Texp(P3T2+P4)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/博客, 欢迎留言◆



http://blog.sciencenet.cn/blog-548663-1178788.html

上一篇:GROMACS分析教程:水分子序参数的计算
下一篇:许楠:使用GAFF力场参数化小分子的自动化工具

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-10-20 19:17

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部