【发布时间】:2019-04-09 10:50:24
【问题描述】:
我什至在开始解决这个问题时都遇到了困难。我发现的所有示例要么太简单,要么太复杂而无法消化。
我想在给定一系列输入的情况下找到值S。该函数是单变量但非线性的。 S 将始终介于 -3 .. 3 之间。
我想使用 Apache Commons 库,因为我之前在该代码的其他部分有过经验。
每次我想解决我的问题时,我都知道以下信息:
double R =250.0;
double om1 = 5.0;
double om2 = 15.0;
double th21 = 29.07965;
double th22 = 29.69008;
double D_obs = th21 - th22;
实际值会因解决方案而异,但对于任何一种特定解决方案都是固定的。
我要查找的值是:
double S = 0.0;
这样
double d1 = delta(R,om1,th21,S);
double d2 = delta(R,om2,th22,S);
double D_calc = d1 - d2;
有价值观
double minme = Math.abs(D_obs - D_calc);
一个最小值,或者替代地,解决
double minme = D_obs - D_calc;
minme=0.
函数delta定义为
public static double delta(double R, double om, double th2, double s)
{
if(Math.abs(s) <= 0.0001) //is the displacement == 0?
{
return 0.0;
}
else
{
return Math.toDegrees((-1*Cos(th2)*s-R*Sin(om)+Sqrt(-1*Math.pow(Cos(th2),2)*Math.pow(s,2)+2*Cos(th2)*Sin(om)*R*s-Math.pow(Cos(om),2)*Math.pow(R,2)+Math.pow(R,2)+2*Math.pow(s,2)))/(Sin(th2)*s));
}
}
例如,Cos在其他地方定义为Math.cos(Math.toRadians(val))
我在哪里/可以阅读/做什么来开始解决这个问题?
【问题讨论】:
-
这让我觉得你将不得不使用某种形式的梯度下降算法——也许是
NonLinearConjugateGradientOptimizer。坏消息是,您将需要提供一个梯度才能使其工作 - 区分绝对函数相当痛苦...... -
Documemtation 是差关于如何设置它; this forum question 提供了一些提示...
-
区分绝对函数是 Maple 存在的原因。 :)
标签: java solver minimization