Программирование на Java, попытка создать библиотеку решателей ODE (Новое в объектно-ориентированном кодировании!) - PullRequest
0 голосов
/ 08 октября 2011

Я пытаюсь запрограммировать решатель ODE (аналог ODE45 в MATLAB).Я хочу, чтобы этот решатель был «автономным», т.е. я могу передать ему имя ODE, которое я хочу решить, и он запускает код для этого конкретного дифференциального уравнения.

Пока у меня есть мой основнойкласс (где находится основная часть программы) и класс с именем ODEsolver (где находится решатель ODE).Я хочу иметь возможность позвонить из моего основного класса в ODEsolver и заставить ODE взглянуть на метод, на который ссылается аргумент String (имя ODE, которое я хочу решить)

Способ, которым яПредставьте, что это:

public class Main {
  double y[];
  double x0,xf,y0;
  x0 = 0;
  xf = 10;
  y0 = 1;

  ODEsolver ode1 = new ODEsolver("name_of_ode_to_be_solved");

  y = ode1.ODE45(x0,xf,y0);


}

, где ODE45 - это решатель ODE в классе ODEsolver.

Однако я не знаю, как бы я использовал «name_of_ode_to_be_solved» для создания вызова этого метода(метод не в ODEsolver, он либо в основном, либо в каком-либо другом классе)

Спасибо!

1 Ответ

2 голосов
/ 08 октября 2011

Что вы, вероятно, хотите сделать, это создать перечисление с именем ODE_TYPE, а затем передать его в Factory, который создаст решатель этого типа. Как то так:

ODESolver solver = SolverFactory.Create(ODE_TYPE.FIRST_ORDER_LINEAR);

В этом случае ODESolver будет называться Interface. Затем вы создадите несколько конкретных классов, которые реализуют этот интерфейс. Один для каждого элемента в вашем перечислении.

Я использовал нечто похожее для моего решателя C ++ DE fdtl .

Возможно также, что вы не можете обобщить конструкцию настолько, чтобы использовать фабричный шаблон. В этом случае вы все равно могли бы получить выгоду от использования интерфейса, который вы бы просто создали для конкретной реализации напрямую. Вот так

ODESolver solver = new ODE45(x0, xf, y0);

Вы бы тогда позвонили

solver.solve();
...