Wolfram mathematica mathematica中的不确定性传播公式
我正在尝试编写一段简短的代码来执行错误的传播。到目前为止,我可以得到Mathematica来生成函数f(x1,x2,…,席,…,xn)中的误差deltAff公式,其中的误差为dx1,dx2,…,dxI,…dxn:Wolfram mathematica mathematica中的不确定性传播公式,wolfram-mathematica,uncertainty,Wolfram Mathematica,Uncertainty,我正在尝试编写一段简短的代码来执行错误的传播。到目前为止,我可以得到Mathematica来生成函数f(x1,x2,…,席,…,xn)中的误差deltAff公式,其中的误差为dx1,dx2,…,dxI,…dxn: fError[f_, xi__, dxi__] := Sum[(D[f[xi], xi[[i]]]*dxi[[i]])^2, {i, 1, Length[xi]}]^(1/2) 其中fError要求输入函数f的所有变量都被{…}包围。比如说, d[{mv_, Mv_, Av_}
fError[f_, xi__, dxi__] :=
Sum[(D[f[xi], xi[[i]]]*dxi[[i]])^2, {i, 1, Length[xi]}]^(1/2)
其中fError要求输入函数f的所有变量都被{…}包围。比如说,
d[{mv_, Mv_, Av_}] := 10^(1/5 (mv - Mv + 5 - Av))
FullSimplify[fError[d, {mv, Mv, Av}, {dmv, dMv, dAv}]]
返回
2 Sqrt[10^(-(2/5) (Av - mv + Mv)) (dAv^2 + dmv^2 + dMv^2)] Log[10]
{Sqrt[dy^2 E^(2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
{Sqrt[dy^2 E^(
2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
我的问题是,我如何评估这一点?理想情况下,我希望将fError修改为:
fError[f_, xi__, nxi__, dxi__]
Manipulate[
varlist = ToExpression[variables];
funct = ToExpression[function];
errorFunction[variables, function]
, {variables, "{M,m}"}, {function, "g*(M-m)/(M+m)"},
DisplayAllSteps -> True, LabelStyle -> {FontSize -> 17},
AutoAction -> False,
Initialization :> (
errorFunction[v_, f_] := (
varlist = ToExpression[v];
funct = ToExpression[f];
varlength = Length[Variables[varlist]];
theoretical =
Sqrt[(Total[
Table[(D[funct, Part[varlist, n]]*
Subscript[U, Part[varlist, n]])^2, {n, 1,
varlength}]])];
Part[theoretical, 1];
varlist;
uncert = Table[Subscript[U, Part[varlist, n]], {n, 1, varlength}];
uncert = DeleteCases[uncert, Alternatives @@ {0}];
theoretical = Simplify[theoretical];
Column[{Row[{Grid[{
{"Variables", varlist},
{"Uncertainties", uncert},
{"Function", function},
{"Uncertainty Function", theoretical}}, Alignment -> Left,
Spacings -> {2, 1}, Frame -> All,
ItemStyle -> {"Text", FontSize -> 20},
Background -> {{LightGray, None}}]}],
Row[{
Grid[{{"Brian Gennow March/24/2015"}}, Alignment -> Left,
Spacings -> {2, 1}, ItemStyle -> "Text",
Background -> {{None}}]
}]}]))]
这个问题是5年前发布的,但我最近遇到了同样的问题,我想我应该分享我的解决方案(对于不相关的错误) 我定义了一个函数
errorProp
,它有两个参数,func
和vars
。errorProp
,func
的第一个参数是表达式的符号形式,您希望计算由于其参数错误而导致的其值错误。errorProp
的第二个参数应该是表单列表
{{x1,x1 value, dx1, dx1 value},{x2,x2 value, dx2, dx2 value}, ... ,
{xn,xn value, dxn, dxn value}}
其中,xi
和dxi
是变量及其误差的符号表示,而xi值
和dxi值
是变量及其不确定性的数值(示例见下文)
函数errorProp
返回错误的符号形式、输入函数func
的值以及根据vars
中的输入计算出的func
的错误值。代码如下:
ClearAll[errorProp];
errorProp[func_, vars_] := Module[{derivs=Table[0,{Length[vars]}],
funcErrorForm,funcEval,funcErrorEval,rplcVals,rplcErrors},
For[ii = 1, ii <= Length[vars], ii++,
derivs[[ii]] = D[func, vars[[ii, 1]]];
];
funcErrorForm = Sqrt[Sum[(derivs[[ii]]*vars[[ii, 3]])^2,{ii,Length[vars]}]];
SetAttributes[rplcVals, Listable];
rplcVals = Table[Evaluate[vars[[ii, 1]]] :> Evaluate[vars[[ii, 2]]], {ii,
Length[vars]}];
SetAttributes[rplcErrors, Listable];
rplcErrors = Table[Evaluate[vars[[ii, 3]]] :> Evaluate[vars[[ii, 4]]], {ii,
Length[vars]}];
funcEval = func /. rplcVals;
funcErrorEval = funcErrorForm /. rplcVals /. rplcErrors;
Return[{funcErrorForm, funcEval, funcErrorEval}];
];
返回
2 Sqrt[10^(-(2/5) (Av - mv + Mv)) (dAv^2 + dmv^2 + dMv^2)] Log[10]
{Sqrt[dy^2 E^(2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
{Sqrt[dy^2 E^(
2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
使用错误传播公式计算会返回相同的结果:
{Sqrt[(D[test, x]*dx)^2 + (D[test, y]*dy)^2],
test /. {x :> 0.3, dx :> 0.005, y :> 0.9, dy :> 0.1},
Sqrt[(D[test, x]*dx)^2 + (D[test, y]*dy)^2] /. {x :> 0.3,
dx :> 0.005, y :> 0.9, dy :> 0.1}}
返回
2 Sqrt[10^(-(2/5) (Av - mv + Mv)) (dAv^2 + dmv^2 + dMv^2)] Log[10]
{Sqrt[dy^2 E^(2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
{Sqrt[dy^2 E^(
2 Sqrt[1/y] - (2 x)/y) (-(1/2) (1/y)^(3/2) + x/y^2)^2 + (
dx^2 E^(2 Sqrt[1/y] - (2 x)/y))/y^2], 2.05599, 0.0457029}
Mathematica 12介绍了使用微分方法处理错误传播的函数 因此,虽然不完全符合问题中要求的格式,但类似的情况是可能的:
expression = a^2*b;
expression /. {a -> Around[aval, da], b -> Around[bval, db]}
输出:
aval^2 bval ± Sqrt[aval^4 db^2+4 bval^2 Abs[aval da]^2]
您也可以使用数值来代替aval、bval、da、db。可能会被证明很有用。@rcollyer这些似乎都比我需要的要高级一些。我真的只是在寻找一个优雅的,一行或两行的解决方案,我可以适应各种计算。我也从不需要处理相关的错误。不过,我发现,如果我只调用For(f,席,dxi],{x1--nx1,…},它就可以工作了。这对我来说已经足够好了。不鼓励只使用链接的答案。请从参考链接中引用答案的基本部分,因为如果链接页面发生更改(即使是您的页面),答案可能会变得无效。如果您可以将此代码扩展到相关变量,那就太好了