Algorithm 流体问题中未知数的迭代求解

Algorithm 流体问题中未知数的迭代求解,algorithm,Algorithm,我是一名机械工程师,有一个计算机科学家的问题。这是我正在处理的方程的一个例子: x=√((y-z)×2/r) z=f×(L/D)×(x/2g) f=有x的疯狂东西 等等…(还有更多包含x的方程式) 情况是这样的: 我需要r来找到x,但我需要x来找到z。我还需要x来找到f,这是找到z的一部分。我猜x的值,然后用这个值来求r和f。然后我返回并使用我为r和f找到的值来找到x。我一直这样做,直到猜测和计算结果相同 我的问题是: 我怎样才能让电脑做到这一点?我一直在使用MaTCAD,但是在另一种语言中,比

我是一名机械工程师,有一个计算机科学家的问题。这是我正在处理的方程的一个例子:

x=√((y-z)×2/r)
z=f×(L/D)×(x/2g)
f=有x的疯狂东西
等等…(还有更多包含x的方程式)

情况是这样的: 我需要r来找到x,但我需要x来找到z。我还需要x来找到f,这是找到z的一部分。我猜x的值,然后用这个值来求r和f。然后我返回并使用我为r和f找到的值来找到x。我一直这样做,直到猜测和计算结果相同

我的问题是:
我怎样才能让电脑做到这一点?我一直在使用MaTCAD,但是在另一种语言中,比如C++,很好。

< P>正如评论者所指出的,你的问题的数学方面超出了你可以期待的范围,甚至超出了你可以根据你所发布的细节提供的帮助。 然而,我认为,即使你彻底理解了数学,你的问题也有计算机科学方面的问题需要解决

编写代码时,请尝试将其组织为仅依赖于传递给子例程的参数的函数。因此,编写一个子例程,接受y、z和r的值并返回x。制作另一个函数,它接受f,L,D,G并返回z。现在您有了可测试的例程,您可以检查这些例程以确保它们的计算正确。在例程中检查例程的输入值-例如,在计算x时,如果将0传递给r,则会得到一个除以0的错误。想想你想怎么处理这件事

如果你想以迭代的方式解决这个问题,你需要一种方法,根据一次迭代的结果来决定下一次迭代的值。这也应该封装在一个子例程中。现在,如果您使用的语言只允许从子程序返回一个值(这是最常用的计算语言C、C++、爪哇、C),则需要将所有变量打包成某种数据结构来返回它们。您可以使用实数或double数组,但最好选择创建一个对象,然后您可以根据变量的名称而不是位置引用变量(错误几率较小)

迭代的另一个方面是知道何时停止。当然,当您得到一个收敛的解决方案时,您会这样做。将此决定放入另一个子例程。现在,当您需要更改收敛条件时,代码中只有一个地方可以使用。但是你需要考虑停止的其他原因-如果你的解决方案开始发散而不是收敛,你会怎么做?在放弃之前,您允许运行进行多少次迭代

计算机迭代的另一个方面是舍入误差。从数学上讲,10^40/10^38等于100。数学上10^20+1>10^20。这些陈述在大多数计算中都是不正确的。你的计算可能需要考虑到这一点,否则你最终会得到垃圾数字。这是一个横切关注点的示例,它不适合封装在子例程中


我建议您去看看Python语言和pythonxy.com扩展。相关论坛中的一些人将是一个很好的资源,可以帮助您学习如何迭代求解方程组。

面对迭代算法,您应该做的第一件事是在纸上写下您的想法产生的顺序:

例如:

现在,您已经知道应该实现什么(即使您不知道如何实现)。如果你不能找到一个x_i,r_i或任何东西的闭式表达式,你需要数值求解一维方程。这将意味着更多的工作

现在,对于实现部分,如果您从未编写过程序,那么您应该认真地询问能够帮助您的现场人员(或者雇佣一名实习生并让他编写代码)。我们无法帮助您从头开始,例如C编程,但我们愿意帮助您解决编写程序时可能出现的具体问题


请注意,即使您强烈认为存在唯一的解决方案,您的算法也不能保证收敛。求解非线性方程组是一个困难的课题。

看来mathcad有许多迭代算法的抽象,而不需要直接使用“低级”语言来实现它们。也许这个问题更适合mathcad论坛:


如果您使用的是Mathcad,它具有内置的功能。它被称为求解块

从关键字“给定”开始

给定的

定义所有未知数的猜测值

x:=2 f:=3 r:=2 …

定义约束条件

x=√((y-z)×2/r)

z=f×(L/D)×(x/2g)

f=有x的东西很疯狂

等等(还有更多包含x的方程式)

计算解

查找(x,y,z,r,…)=


查看Mathcad帮助或快速表以获取确切语法的示例。

您的问题的简单答案是以下伪代码:

X = startingX;
lastF = Infinity;
F = 0;
tolerance = 1e-10;
while ((lastF - F)^2 > tolerance)
{
    lastF = F;
    X = ?;
    R = ?;
    F = FunctionOf(X,R);
}
这可能根本无法实现您的期望。它可能给出一个有效但毫无意义的答案,也可能在错误答案之间无休止地循环

这是收敛的标准替代。还有更先进的技术,比如,但我不确定你是否想去那里。我在考虑是否要去那里时发现了这篇文章

一般来说,思考如何将问题转化为更简单的问题是值得的

根据我的经验,最好将您的问题作为一元有界寻根问题,如果可以的话,使用

Nex
X = startingX;
lastF = Infinity;
F = 0;
tolerance = 1e-10;
while ((lastF - F)^2 > tolerance)
{
    lastF = F;
    X = ?;
    R = ?;
    F = FunctionOf(X,R);
}