最近在做一个方程参数拟合的东西,是通过相平衡来实现的,简单来说就是输入温度和压力,输出两个组成。
FindRoot 的部分如下:
(*封装相平衡函数*)
xph[T_?NumericQ, p_?NumericQ, k12_?NumericQ] := Module[{},
{y1, x1} /.
FindRoot[{(yidu[p, T, y1, x1, 1, 1, k12] -
yidu[p, T, y1, x1, 2, 1, k12]) ==
0, (yidu[p, T, y1, x1, 1, 2, k12] -
yidu[p, T, y1, x1, 2, 2, k12]) == 0}, {{y1, 0.99, 0.98, 0.65,
1}, {x1, 0.01, 0.02, 0, 0.6}}, AccuracyGoal -> 4,
PrecisionGoal -> 4]
];
计算结果如下:
代码如下:
(*循环多个x计算相平衡*)
p = 101325.;
CalT = {280.25, 281.25, 282.15, 283.05, 284.25, 285.35, 286.25,
287.05, 288.15, 289.25, 290.05, 292.35, 293.05};
k12 = 0.0619;
listpy1 = ParallelMap[xph[#, p, k12] &, CalT]; // AbsoluteTiming
listpy1 // MatrixForm
(*计算累计误差*)
xd\[Delta] = 1/Length[CalT] (\!\(
\*UnderoverscriptBox[\(\[Sum]\), \(i = 1\), \(Length[CalT]\)]\((
\*FractionBox[\(Abs[
listpy1[\([\)\(i, 1\)\(]\)] -
expdatey1[\([\)\(i\)\(]\)]]\), \
\(expdatey1[\([\)\(i\)\(]\)]\)])\)\) + \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(i = 1\), \(Length[CalT]\)]\((
\*FractionBox[\(Abs[
listpy1[\([\)\(i, 2\)\(]\)] -
expdatex1[\([\)\(i\)\(]\)]]\), \
\(expdatex1[\([\)\(i\)\(]\)]\)])\)\))
运行总会出现如下错误:FindRoot::reged: The point {0.595884,0.591277} is at the edge of the search region {0.65,1.} in coordinate 1 and the computed search direction points outside the region.
由于一组是13个数据,有时候13个甚至全部出错。所以每次都会很小心设定 x1 和y1 的初值以及 k 的初值,但这样也不能很好的避免出现错误。
由于是有实验数值基础作为支撑的,所以认定是一定可以在范围内有解的。
在最后需要寻找一个最优解,所以会自动改变 k 值,但是一运行就会满篇红。
求各位大神帮忙看看怎么解?
最后贴出源程序:
http://mmaqa.com/?qa=blob&qa_blobid=11071936547720347369