#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();