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

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

На данный момент у меня есть основной класс (где находится основная часть программы) и класс под названием 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 — решатель ОДУ в классе ODEsolver.

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

Спасибо!


person John Robinson    schedule 07.10.2011    source источник


Ответы (1)


Что вы, вероятно, захотите сделать, так это создать перечисление с именем 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();
person Waylon Flinn    schedule 07.10.2011