公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
2.6k 浏览

最近在做一个方程参数拟合的东西,是通过相平衡来实现的,简单来说就是输入温度和压力,输出两个组成。

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

 

分类:方程 | 用户: xliuli2240 (41 分)
修改于 用户:xliuli2240
请问你这个是二元相图还是?
看来遇到同专业的了?
这个程序目前计算汽液相平衡比较容易,算液液经常会出现问题,下一步准备试一下固液的。
现在遇到了一个新的问题,我用 NMinimize 或者 FindMinimum 这两个函数来回归参数的时候,如果我限制了参数的范围,他就不停地计算,停不下来了,我在想是不是精度的问题?
代码太长了,不想读,不过你看过这帖了吗:http://mathematica.stackexchange.com/q/275/1871 顺便相平衡问题按理来说应该有唯一解?那你试过NMinimize的"DifferentialEvolution" 方法了吗?
感谢回复!我会仔细读一读并试试 DifferentialEvolution 方法的!

1个回答

0 投票
自己想到一个办法,自己来尝试一下:

FindRoot 的找根计算主要和初值有关系,由于这个项目是有实验值作为基础的,所以我考虑将实验数值作为找根的初值进行计算。

相比之前,全局找根使用同一个或者两个初值,不能很好地适应每一次相平衡计算;而将初值设定为每一次相平衡的实验值。

后面将开始修改程序,成功后就回来更新一下。
用户: xliuli2240 (41 分)
...