【发布时间】:2013-12-20 11:07:41
【问题描述】:
我有一个非线性动力学系统,我可以将其求解到最优。我知道如何在 MATLAB 中做到这一点,但我希望在 JAVA 中实现这一点。由于某种原因,我迷失在如何用 Java 中做到这一点。
我所拥有的如下:
z(t),它返回动态系统中的状态。
z(t) = [state1(t),...,state10(t)]
这个动态系统的变化率由下式给出:
z'(t) = f(z(t),u(t),d(t)) = [dstate1(t)/dt,...,dstate10(t)/dt]
其中 u(t) 和 d(t) 是一些我知道其值的外部变量。
此外,我还有一个函数,让我们表示从状态变量定义的 g(t):
g(t) = state4(t)/c1
其中 c1 是一些常数。
现在我希望求解以下无约束非线性系统:
g(t) - c2 = 0
f(z(t),u(t),0)= 0
其中 c2 是一些常数。上面的系统可以看作是一个简单的 f'(x) = 0 问题,由 11 个方程和 1 个未知数组成,如果我应该在 MATLAB 中解决这个问题,我会做以下事情:
[output] = fsolve(@myDerivatives, someInitialGuess);
我知道 JAVA 没有任何内置求解器。因此,在我看来,解决上述问题有两种选择:
选项 1:自己动手:我可以使用数值方法,例如高斯牛顿或类似的非线性方程组求解。不过,我会先使用 java 工具箱,然后再使用数值方法。
选项 2:求解器(例如 commons optim) 这个解决方案是我想要研究的。我一直在研究这个工具箱,但是,我没有找到一个关于如何实际使用 MultiVariateFunction 评估器和数值优化器的确切示例。你们中有人有这方面的经验吗?
如果您对解决此问题有任何想法或建议,请告诉我。 谢谢!
【问题讨论】:
-
您能否说明 z'(t) 的含义,它是一个包含 10 个值的数组,为 0 ? Java没有自带求解库,需要自己实现。
-
由于 Java 不附带数学求解库,因此有 2 种(可能 3 种)方法来处理它: 1. 下载一个支持数学的库 - 也许 commons.apache.org/proper/commons-math 会派上用场; 2、matlab与java的混合:你不妨看看mathworks.com/products/javabuilder和stackoverflow.com/questions/1607933/…; 3.自己做
-
我认为你最好在 Google 上搜索(比如)“java 非线性优化”并搜索搜索结果。
-
我现在已经完善了关于 commons optim 工具箱的问题,我已经研究过 - 但未能实施。
-
@PeterLawrey z'(t)=0,表示状态向量 z(t) 的值不应改变。
标签: java matlab optimization numerical-methods