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

#java #ode

#java #ode

Вопрос:

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

Пока у меня есть мой основной класс (где находится основная часть программы) и класс с именем ODEsolver (где находится решатель ODE). Я хочу иметь возможность вызывать из моего основного класса ODEsolver и попросить ODE посмотреть на метод, на который ссылается строковый аргумент (имя 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, он либо в main, либо в каком-либо другом классе)

Спасибо!

Ответ №1:

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

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

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

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

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

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

затем вы должны вызвать

 solver.solve();