即使开始解决这个问题,我也遇到困难。我发现的所有示例太简单或太复杂而难以消化。
鉴于一系列输入,我想找到值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))
在哪里/可以读什么/做些什么来开始解决这个问题?
答案 0 :(得分:0)
我找到了可以使用的答案:Newton-Raphson method using the Math.Commons library
关键代码是
public static void main(String args[])
{
//setup all variables
final double R =(new Double(args[0])).doubleValue(); //=250.0;
final double om1 =(new Double(args[1])).doubleValue(); //= 5.0;
final double om2 =(new Double(args[2])).doubleValue(); //= 15.0;
final double th21=(new Double(args[3])).doubleValue(); //= 29.07965;
final double th22=(new Double(args[4])).doubleValue(); //= 29.69008;
final double D_obs = th21 - th22;
BisectionSolver solver = new BisectionSolver();
UnivariateFunction f = new UnivariateFunction()
{
public double value(double s) {
return ((delta(R,om1,th21,s)-delta(R,om2,th22,s)) - (D_obs));
}
};
System.out.printf("The speciment offset is %.3f mm.\n", solver.solve(1000, f, -3, 3));
}