У меня вопрос по алгоритму. Делаю линеаризацию. Я хочу загнать общую часть вычислений в отдельный метод. Чтобы не вдаваться в математические подробности, приведу код и объясню.
public ArrayList<Double> calculateCommonPart(){
ArrayList <Ellipse2D.Double> transformedData = new ArrayList<>();
ArrayList<Double> result = new ArrayList<>();
for (int i = 0; i <pointList.size(); i++) {
transformedData.add(pointList.get(i));
}
// линеаризация y = ax^b
// считаем коэффициенты a и b
double averageProductXY =0;
double averageX =0;
double averageY =0;
double averageSqrX = 0;
int n = pointList.size();
double newX =0;
double newY =0;
for (int i = 0; i < n ; i++) {
Ellipse2D.Double CurrentPoint = pointList.get(i);
// разные newX и newY для разных формул, остальное общее для всех формул
newX = Math.log(CurrentPoint.getX());
newY = Math.log(CurrentPoint.getY());
averageX += newX;
averageY +=newY;
averageSqrX += Math.pow(newX, 2);
averageProductXY += newX*newY;
}
averageProductXY /=n;
averageX/=n;
averageY/=n;
averageSqrX/=n;
double sqrDispX = 0d;
sqrDispX = averageSqrX - Math.pow(averageX,2);
double a =(averageSqrX*averageY - averageX*averageProductXY)/sqrDispX;
double b =0d;
b = (averageProductXY-averageX*averageY)/(sqrDispX);
result.add(a);
result.add(b);
return result;
}
Проблема в том, что я не знаю, как реализовать вариативное присваивание переменным newX
и newY
их значений. Например, для функции вида y = ax^b
newX = Math.log(x); newY = log(y), а для функции
y = x/(ax+b)newX = 1/x newY = 1/y
Привожу таблицу линеаризации
Как можно эту разную часть разграничить с общей? Подскажите алгоритм
Реализуйте патерн шаблонный метод
Помещаете ваш метод в Абстрактный класс
public abstract class CalculatorAbstract{
public ArrayList<Double> calculateCommonPart(){
...
// разные newX и newY для разных формул, остальное общее для всех формул
newX = getNewX();
newY = getNewY();
...
}
public abstract double getNewX();
public abstract double getNewY();
}
Дальше создаете конкретные реализации
public class CalculatorConcrete extends CalculatorAbstract{
@Override
public double getNewX(){
return Math.log(CurrentPoint.getX());
}
@Override
public double getNewY(){
return Math.log(CurrentPoint.getY());
}
}
Подробней про паттерн можно прочитать здесь https://systems-ez.ru/index.php/ru/patterns/template-method
Вынестие частное в отдельные классы, которые реализуют один и тот же интерфейс, и в общем коде обращайтесь к этому интерфейсу
interface newXY { // если x и y вычисляются всегда одинаково, то достаточно и одного метода
double getNewX(double x);
double getNewY(double y);
}
// и несколько реализаций по функциям
class newXYLog implements newXY {
@Override
double getNewX(double x) {
return Math.log(x);
}
@Override
double getNewY(double y) {
return Math.log(y);
}
}
// и в коде у вас будет
newXY func = ...; //
...
newX = func.getNewX(CurrentPoint.getX())
newY = func.getNewY(CurrentPoint.getY())
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не могу понять почему не работает вот такого вида событие hover
Хочу через php скрипт запустить работу в фоне другого скрипта, для этого в script_1php пишу такой код: