我有一个非线性动力学系统,我可以解决它的最优性。我知道如何在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个unkowns组成,如果我想在MATLAB中解决这个问题,我会做以下几点:
[output] = fsolve(@myDerivatives, someInitialGuess);
我知道JAVA并没有附带任何内置求解器。因此,我认为解决上述问题有两种选择:
选项1:自己动手:我可以使用数值方法,例如高斯牛顿或类似的解决这个非线性方程组。但是,我将首先使用java工具箱,然后再使用数值方法。
选项2:解算器(例如,commons optim)此解决方案是我想要研究的内容。我一直在研究这个工具箱,但是,我没有找到如何实际使用MultiVariateFunction评估器和数值优化器的确切示例。你们有没有这方面的经验?
如果您对解决此问题有任何想法或建议,请与我们联系。 谢谢!
答案 0 :(得分:0)
请比较原始问题:
全局优化问题
minimize f(y)
通过寻找衍生系统的解决方案来解决
0=grad f(y) or 0=df/dy (partial derivatives)
(渐变是包含所有偏导数的列向量),也就是说,您正在计算f(y)的“平坦”或水平点。
用于约束下的优化
minimize f(y,u) such that g(y,u)=0
构建拉格朗日函数
L(y,p,u) = f(y,u)+p*g(y,u) (scalar product)
然后计算该系统的平坦点,即
g(y,u)=0, dL/dy(y,p,u)=0, dL/du(y,p,u)=0
之后,同样在全局优化案例中,您必须确定扁平点的类型,最大值,最小值或鞍点。
最佳控制问题具有结构(几种等效变体之一)
minimize integral(0,T) f(t,y(t),u(t)) dt
such that y'(t)=g(t,y(t),u(t)), y(0)=y0 and h(T,y(T))=0
要解决这个问题,可以考虑汉密尔顿主义
H(t,y,p,u)=f(t,y,u)-p*g(t,y,u)
并获得转化后的问题
y' = -dH/dp = g, (partial derivatives, gradient)
p' = dH/dy,
with boundary conditions
y(0)=y0, p(T)= something with dh/dy(T,y(T))
u(t) realizes the minimum in v -> H(t,y(t),p(t),v)