diff --git a/src/main/java/formula/Addition.java b/src/main/java/formula/Addition.java new file mode 100644 index 0000000000000000000000000000000000000000..2f332a7dea65a51249d43aa152be8e271582c542 --- /dev/null +++ b/src/main/java/formula/Addition.java @@ -0,0 +1,17 @@ +package formula; + +public class Addition extends BinaryOperation { + public Addition(Formula leftMember, Formula rightMember) { + super(leftMember, rightMember, "+"); + } + + @Override + protected double compute(double leftValue, double rightValue) { + return leftValue + rightValue; + } + + @Override + public Formula derivative() { + return new Addition(leftMember.derivative(), rightMember.derivative()); + } +} diff --git a/src/main/java/formula/BinaryOperation.java b/src/main/java/formula/BinaryOperation.java new file mode 100644 index 0000000000000000000000000000000000000000..caccbbeef03dfa0649c26d91a81600cbf7bd99a4 --- /dev/null +++ b/src/main/java/formula/BinaryOperation.java @@ -0,0 +1,25 @@ +package formula; + +public abstract class BinaryOperation implements Formula { + final Formula leftMember; + final Formula rightMember; + final String operatorSymbol; + + public BinaryOperation(Formula leftMember, Formula rightMember, String operatorSymbol) { + this.leftMember = leftMember; + this.rightMember = rightMember; + this.operatorSymbol = operatorSymbol; + } + + @Override + public String toString() { + return "(" + leftMember + " " + operatorSymbol + " " + rightMember + ")"; + } + + @Override + public double eval(double xValue) { + return compute(leftMember.eval(xValue), rightMember.eval(xValue)); + } + + protected abstract double compute(double leftValue, double rightValue); +} diff --git a/src/main/java/formula/Constant.java b/src/main/java/formula/Constant.java index 12359a7ee721948a677a54a091215e65d5c3b5bc..a4e9e5ed14af5f9b73e9ad05fab7c5361c89870b 100644 --- a/src/main/java/formula/Constant.java +++ b/src/main/java/formula/Constant.java @@ -4,10 +4,10 @@ import java.util.HashMap; public class Constant implements Formula { - private double value; + private final double value; public Constant(double value) { - // TODO : change the code. + this.value = value; } /** @@ -18,8 +18,7 @@ public class Constant implements Formula { */ @Override public double eval(double xValue) { - // TODO : change the code. - return 0; + return value; } /** @@ -29,8 +28,7 @@ public class Constant implements Formula { */ @Override public Formula derivative() { - // TODO : change the code. - return this; + return new Constant(0); } /** @@ -40,8 +38,7 @@ public class Constant implements Formula { */ @Override public String toString() { - // TODO : change the code. - return "toto"; + return Double.toString(value); } /** diff --git a/src/main/java/formula/Cosine.java b/src/main/java/formula/Cosine.java new file mode 100644 index 0000000000000000000000000000000000000000..5108eef7282a55343515c82b2e57e6d03825cf8e --- /dev/null +++ b/src/main/java/formula/Cosine.java @@ -0,0 +1,17 @@ +package formula; + +public class Cosine extends UnaryOperation { + public Cosine(Formula member) { + super(member, "cos"); + } + + @Override + protected double compute(double value) { + return Math.cos(value); + } + + @Override + public Formula derivative() { + return new Opposite(new Multiplication(member.derivative(), new Sine(member))); + } +} diff --git a/src/main/java/formula/Division.java b/src/main/java/formula/Division.java new file mode 100644 index 0000000000000000000000000000000000000000..528bac9dd9c9b73e69377d4695b948e7019bdf7a --- /dev/null +++ b/src/main/java/formula/Division.java @@ -0,0 +1,19 @@ +package formula; + +public class Division extends BinaryOperation { + public Division(Formula dividend, Formula divisor) { + super(dividend, divisor, "/"); + } + + @Override + protected double compute(double leftValue, double rightValue) { + return leftValue/rightValue; + } + + @Override + public Formula derivative() { + return new Division(new Subtraction(new Multiplication(leftMember.derivative(), rightMember), + new Multiplication(leftMember, rightMember.derivative())), + new Multiplication(rightMember, rightMember)); + } +} diff --git a/src/main/java/formula/Exponential.java b/src/main/java/formula/Exponential.java new file mode 100644 index 0000000000000000000000000000000000000000..7fdc0e8f4dd9e6afdedd740d169e90e7aa3d551b --- /dev/null +++ b/src/main/java/formula/Exponential.java @@ -0,0 +1,17 @@ +package formula; + +public class Exponential extends UnaryOperation { + public Exponential(Formula member) { + super(member, "e^"); + } + + @Override + protected double compute(double value) { + return Math.exp(value); + } + + @Override + public Formula derivative() { + return new Multiplication(member.derivative(), new Exponential(member)); + } +} diff --git a/src/main/java/formula/Logarithm.java b/src/main/java/formula/Logarithm.java new file mode 100644 index 0000000000000000000000000000000000000000..963c3b9fb0d9330fa25ba76ab07987b30e6130d5 --- /dev/null +++ b/src/main/java/formula/Logarithm.java @@ -0,0 +1,17 @@ +package formula; + +public class Logarithm extends UnaryOperation { + public Logarithm(Formula member) { + super(member, "log"); + } + + @Override + protected double compute(double value) { + return Math.log(value); + } + + @Override + public Formula derivative() { + return new Division(member.derivative(), member); + } +} diff --git a/src/main/java/formula/Multiplication.java b/src/main/java/formula/Multiplication.java new file mode 100644 index 0000000000000000000000000000000000000000..ebef51fdc3693fca152c8675aa41fa7fb203a13e --- /dev/null +++ b/src/main/java/formula/Multiplication.java @@ -0,0 +1,18 @@ +package formula; + +public class Multiplication extends BinaryOperation { + public Multiplication(Formula leftMember, Formula rightMember) { + super(leftMember, rightMember, "*"); + } + + @Override + protected double compute(double leftValue, double rightValue) { + return leftValue * rightValue; + } + + @Override + public Formula derivative() { + return new Addition(new Multiplication(leftMember.derivative(), rightMember), + new Multiplication(leftMember, rightMember.derivative())); + } +} diff --git a/src/main/java/formula/Opposite.java b/src/main/java/formula/Opposite.java new file mode 100644 index 0000000000000000000000000000000000000000..1402959f5133e115f0303ac035283733f3a71470 --- /dev/null +++ b/src/main/java/formula/Opposite.java @@ -0,0 +1,17 @@ +package formula; + +public class Opposite extends UnaryOperation{ + public Opposite(Formula member) { + super(member, "-"); + } + + @Override + public Formula derivative() { + return new Opposite(member.derivative()); + } + + @Override + protected double compute(double value) { + return -value; + } +} diff --git a/src/main/java/formula/Sine.java b/src/main/java/formula/Sine.java new file mode 100644 index 0000000000000000000000000000000000000000..e2e4aceec8a113584046e40d7f41b414e6978c93 --- /dev/null +++ b/src/main/java/formula/Sine.java @@ -0,0 +1,17 @@ +package formula; + +public class Sine extends UnaryOperation { + public Sine(Formula member) { + super(member, "sin"); + } + + @Override + protected double compute(double value) { + return Math.sin(value); + } + + @Override + public Formula derivative() { + return new Multiplication(member.derivative(), new Cosine(member)); + } +} diff --git a/src/main/java/formula/Subtraction.java b/src/main/java/formula/Subtraction.java new file mode 100644 index 0000000000000000000000000000000000000000..e52c052a7ea47790181a180005a9730711c78603 --- /dev/null +++ b/src/main/java/formula/Subtraction.java @@ -0,0 +1,17 @@ +package formula; + +public class Subtraction extends BinaryOperation { + public Subtraction(Formula subtrahend, Formula minuend) { + super(subtrahend, minuend, "-"); + } + + @Override + protected double compute(double leftValue, double rightValue) { + return leftValue - rightValue; + } + + @Override + public Formula derivative() { + return new Subtraction(leftMember.derivative(), rightMember.derivative()); + } +} diff --git a/src/main/java/formula/UnaryOperation.java b/src/main/java/formula/UnaryOperation.java new file mode 100644 index 0000000000000000000000000000000000000000..f1bb7b9ddd2421e2fb3ebe369f75f089eb3e1d2b --- /dev/null +++ b/src/main/java/formula/UnaryOperation.java @@ -0,0 +1,23 @@ +package formula; + +public abstract class UnaryOperation implements Formula { + protected final Formula member; + private final String symbol; + + public UnaryOperation(Formula member, String symbol) { + this.member = member; + this.symbol = symbol; + } + + @Override + public double eval(double xValue) { + return compute(member.eval(xValue)); + } + + protected abstract double compute(double value); + + @Override + public String toString() { + return symbol + "(" + member + ")"; + } +} diff --git a/src/main/java/formula/VariableX.java b/src/main/java/formula/VariableX.java new file mode 100644 index 0000000000000000000000000000000000000000..3ecbe56a5aecc69d57fac55273e84b8782333bcf --- /dev/null +++ b/src/main/java/formula/VariableX.java @@ -0,0 +1,18 @@ +package formula; + +public class VariableX implements Formula { + @Override + public double eval(double xValue) { + return xValue; + } + + @Override + public String toString() { + return "x"; + } + + @Override + public Formula derivative() { + return new Constant(1); + } +} diff --git a/src/main/java/viewer/FunctionList.java b/src/main/java/viewer/FunctionList.java index 68d0c3485c957d0b831ccbe92e99897892706741..cca47099c5732f7d8039b10920408f698b73627a 100644 --- a/src/main/java/viewer/FunctionList.java +++ b/src/main/java/viewer/FunctionList.java @@ -1,6 +1,6 @@ package viewer; -import formula.Constant; +import formula.*; import javafx.scene.chart.XYChart; import java.util.ArrayList; @@ -19,8 +19,12 @@ class FunctionList { this.lowerBound = functionChart.getLowerBound(); this.upperBound = functionChart.getUpperBound(); - PlottableFunction function = new PlottableFunction(new Constant(1), "f"); - addFunctionAndItsDerivative(function); + List<PlottableFunction> functions = List.of(new PlottableFunction(new Logarithm(new VariableX()),"f"), + new PlottableFunction(new Multiplication(new VariableX(), new Constant(3)), "g"), + new PlottableFunction(new Division(new Constant(1), new VariableX()), "h"), + new PlottableFunction(new Cosine(new Multiplication(new Constant(2), new VariableX())), "a"), + new PlottableFunction(new Exponential(new Multiplication(new Constant(2), new VariableX())), "a")); + addFunctionsAndTheirDerivative(functions); } void toggleFunction(PlottableFunction function) { diff --git a/src/main/java/viewer/MainAppController.java b/src/main/java/viewer/MainAppController.java index 329cd94050ed206717deeca17a3b11859e8559d1..fa240197e00ec9a2e97d1aa9f8052e886d1056c6 100644 --- a/src/main/java/viewer/MainAppController.java +++ b/src/main/java/viewer/MainAppController.java @@ -45,7 +45,6 @@ public class MainAppController implements Initializable { Button button = new Button(function.toString()); addButton(button); button.setOnAction(event -> toggleFunction(function)); - toggleFunction(function); } private void toggleFunction(PlottableFunction function){