如何在JAVA中更改预定义接口中的参数?
最近,我从中实现了一个ODE解算器。我觉得这很好,但我有一些问题,部分与JAVA接口有关,部分与工具箱本身有关。我希望你们中的一位能在某些方面帮助我。我正在使用主页上显示的示例 他们开始定义ODE函数本身:如何在JAVA中更改预定义接口中的参数?,java,multithreading,apache,numerical-methods,ode,Java,Multithreading,Apache,Numerical Methods,Ode,最近,我从中实现了一个ODE解算器。我觉得这很好,但我有一些问题,部分与JAVA接口有关,部分与工具箱本身有关。我希望你们中的一位能在某些方面帮助我。我正在使用主页上显示的示例 他们开始定义ODE函数本身: private static class CircleODE implements FirstOrderDifferentialEquations { public double[] c; public double omega; public CircleODE(double[] c,
private static class CircleODE implements FirstOrderDifferentialEquations {
public double[] c;
public double omega;
public CircleODE(double[] c, double omega) {
this.c = c;
this.omega = omega;
}
public int getDimension() {
return 2;
}
public void computeDerivatives(double t, double[] y, double[] yDot) {
yDot[0] = omega * (c[1] - y[1]);
yDot[1] = omega * (y[0] - c[0]);
}
}
然后将积分器和模型实例化:
FirstOrderIntegrator dp853 = new DormandPrince853Integrator(1.0e-8, 100.0, 1.0e-10, 1.0e-10);
FirstOrderDifferentialEquations ode = new CircleODE(new double[] { 1.0, 1.0 }, 0.1);
从这里,它们有一些初始值,并从初始值计算到一些最终状态:
double[] y = new double[] { 0.0, 1.0 }; // initial state
dp853.integrate(ode, 0.0, y, 16.0, y); // now y contains final state at time t=16.0
我的问题:现在假设我想将ω的值从t=16改为t=23。我该如何解决这个问题
我的建议(无效):
提案1:
我考虑过使用变量static
:
public static double omega;
但我的意图是在某个时候运行多线程,所以将omega
设置为static被证明是个坏主意
提案2:
然后我考虑创建一个新的接口
,它可以在CircleODE中启用setter和getter方法,从而允许我随时更改omega
的值
public interface Circle{
public void setOmega(double myNewValueOfOmega);
}
CircleODE的号召将变成:
private static class CircleODE implements FirstOrderDifferentialEquations, Circle
我想“这是一个非常好的主意,我现在需要做的就是像这样调用set方法:
ode.setOmega(newValueOfOmega);
这是不可能的,因为ode
实际上是一阶微分方程的一个实例
(我想),因此我的新方法setOmega无法调用
您对我如何在不创建新的
ode
实例的情况下更改Omega的值有什么建议吗?您可以将其转换回CircleODE,仅用于设置Omega,并调用方法setOmega而不创建新实例
FirstOrderIntegrator dp853 = new DormandPrince853Integrator(1.0e-8, 100.0, 1.0e-10, 1.0e-10);
FirstOrderDifferentialEquations ode = new CircleODE(new double[] { 1.0, 1.0 }, 0.1);
((CircleODE)ode).setOmega(newValueOfOmega);
对于代码的其余部分,ode将仍然是一阶微分方程的实例
其次,您可以编写一个实用程序类/方法来实现相同的功能,但要进行封装。如果
CircleODE
同时实现firstorderedifferentialsequations
和Circle
,为什么不使用CircleODE=newcircleode();
?那么您就可以自由地使用setOmega()
。说得好。我将尝试实现并返回。感谢您的回复!@victorantunes,您的建议似乎确实有效。您对Jaffar的建议有何评论?最好是什么?除了用于类型检查的运行时开销非常小之外,我认为您的代码示例没有什么不同。如果您真的这么做了,那么这两种方法都可以。谢谢你的回复,Jaffar。你认为什么最适合使用?实用程序类将更易于使用和维护。我最后使用了victorantunes示例,这看起来确实有效。