Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JAVA中更改预定义接口中的参数?_Java_Multithreading_Apache_Numerical Methods_Ode - Fatal编程技术网

如何在JAVA中更改预定义接口中的参数?

如何在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,

最近,我从中实现了一个ODE解算器。我觉得这很好,但我有一些问题,部分与JAVA接口有关,部分与工具箱本身有关。我希望你们中的一位能在某些方面帮助我。我正在使用主页上显示的示例

他们开始定义ODE函数本身:

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示例,这看起来确实有效。