Skip to content

Commit ebee002

Browse files
committed
Fixed point and Secant methods are implemented
1 parent fba9177 commit ebee002

9 files changed

+330
-13
lines changed

Nonlinear Equation.iml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,23 @@
77
</content>
88
<orderEntry type="inheritedJdk" />
99
<orderEntry type="sourceFolder" forTests="false" />
10+
<orderEntry type="module-library">
11+
<library>
12+
<CLASSES>
13+
<root url="jar://$USER_HOME$/Downloads/j-text-utils-0.3.3.jar!/" />
14+
</CLASSES>
15+
<JAVADOC />
16+
<SOURCES />
17+
</library>
18+
</orderEntry>
19+
<orderEntry type="module-library">
20+
<library>
21+
<CLASSES>
22+
<root url="jar://$USER_HOME$/Downloads/commons-lang-2.6.jar!/" />
23+
</CLASSES>
24+
<JAVADOC />
25+
<SOURCES />
26+
</library>
27+
</orderEntry>
1028
</component>
11-
</module>
12-
29+
</module>

src/ConsoleUI/ConsoleUI.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package ConsoleUI;
2+
3+
import Model.UserDataIteration;
4+
import Model.UserDataSecant;
5+
6+
import java.io.BufferedReader;
7+
import java.io.InputStreamReader;
8+
9+
public class ConsoleUI {
10+
11+
// Model for storing user input
12+
BufferedReader br;
13+
14+
public ConsoleUI()
15+
{
16+
this.br = new BufferedReader(new InputStreamReader(System.in));
17+
}
18+
19+
public boolean printFixedPointIterationMeniu(UserDataIteration iterationData)
20+
{
21+
System.out.println("------Fixed point iteration Method------");
22+
System.out.println("Enter fixed point iteration method parameters");
23+
24+
try{
25+
System.out.println("Initial guess, the closer the better: ");
26+
iterationData.intial_guess = Double.parseDouble(br.readLine());
27+
28+
System.out.println("Desired precision: ");
29+
iterationData.precision = Double.parseDouble(br.readLine());
30+
31+
System.out.println("Max derivative in chosen interval: ");
32+
iterationData.derivative = Double.parseDouble(br.readLine());
33+
34+
System.out.println("Max iteration number: ");
35+
iterationData.max_iteration_number = Integer.parseInt(br.readLine());
36+
37+
}catch(Exception nfe){
38+
System.err.println("Invalid Format! Please try again :)");
39+
return false;
40+
}
41+
42+
System.out.println();
43+
44+
return true;
45+
}
46+
47+
public boolean printSecantMethodMeniu(UserDataSecant dataSecant)
48+
{
49+
System.out.println("------Secant Method------");
50+
System.out.println("Enter secant method parameters");
51+
52+
try{
53+
System.out.println("First guess: ");
54+
dataSecant.first_guess = Double.parseDouble(br.readLine());
55+
56+
System.out.println("Second guess: ");
57+
dataSecant.second_guess = Double.parseDouble(br.readLine());
58+
59+
System.out.println("Desired precesion: ");
60+
dataSecant.precision = Double.parseDouble(br.readLine());
61+
62+
System.out.println("Max iteration number: ");
63+
dataSecant.max_iteration_number = Integer.parseInt(br.readLine());
64+
65+
}catch(Exception nfe){
66+
System.err.println("Invalid Format! Please try again :)");
67+
return false;
68+
}
69+
return true;
70+
}
71+
72+
73+
74+
public void GreetingMessage()
75+
{
76+
System.out.println();
77+
System.out.println("Please enter parameters, equation to be solved: x = tang(x)");
78+
System.out.println("-----------------------------------------------------------");
79+
System.out.println();
80+
}
81+
}

src/Main.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1+
import ConsoleUI.ConsoleUI;
2+
import Model.UserDataIteration;
3+
import Model.UserDataSecant;
14
import NumericalMethods.NonLinearMethod;
25
import NumericalMethods.NonLinearMethodFactory;
3-
import com.sun.deploy.security.MSCryptoDSASignature;
6+
import java.io.BufferedReader;
7+
import java.io.InputStreamReader;
48

59
public class Main {
610

711
public static void main(String[] args) {
8-
System.out.println("Please enter parameters of the function tan(x)");
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
ConsoleUI userUI = new ConsoleUI();
14+
15+
// Greeting user message
16+
userUI.GreetingMessage();
17+
18+
// Asking user for iteration method info
19+
UserDataIteration userIterationData = new UserDataIteration();
20+
userUI.printFixedPointIterationMeniu(userIterationData);
21+
22+
// Asking user for secant method info
23+
UserDataSecant userSecantData = new UserDataSecant();
24+
userUI.printSecantMethodMeniu(userSecantData);
925

1026
//Creating Numerical method factory to produce methods
11-
NonLinearMethodFactory nonlinerFactor = new NonLinearMethodFactory();
27+
NonLinearMethodFactory nonlinerFactor = new NonLinearMethodFactory(userIterationData.intial_guess, userIterationData.derivative, userIterationData.precision, userIterationData.max_iteration_number, userSecantData.first_guess, userSecantData.second_guess, userSecantData.max_iteration_number, userSecantData.precision);
1228

1329
// Calculating with the method Fixed point iteration
1430
NonLinearMethod fixedPoint = nonlinerFactor.getNonLinearMethod("FixedPoint");
@@ -17,8 +33,5 @@ public static void main(String[] args) {
1733
// Calculating with the method Secant
1834
NonLinearMethod secant = nonlinerFactor.getNonLinearMethod("Secant");
1935
secant.calculate();
20-
2136
}
22-
23-
2437
}

src/Model/Iteration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package Model;
2+
3+
public class Iteration {
4+
public int iterationNum;
5+
public double first_guess;
6+
public double second_guess;
7+
public double result_funct;
8+
public double difference;
9+
}

src/Model/UserDataIteration.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package Model;
2+
3+
public class UserDataIteration {
4+
public double intial_guess;
5+
public int max_iteration_number;
6+
public double derivative;
7+
public double precision;
8+
}

src/Model/UserDataSecant.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package Model;
2+
3+
public class UserDataSecant {
4+
public double first_guess;
5+
public double second_guess;
6+
public int max_iteration_number;
7+
public double precision;
8+
}
Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,78 @@
11
package NumericalMethods;
22

3+
import dnl.utils.text.table.*;
4+
import Model.Iteration;
5+
import java.util.*;
6+
37
public class FixedPointIteration implements NonLinearMethod {
8+
public double maxDerivitive; // Calculated max derivative in defined interval
9+
public double precision; // User defined allowance
10+
public double initialGuess; // Initial guess
11+
public int maxIterationNumber; // Max iteration number
12+
13+
public FixedPointIteration(double maxDerivative, double precision, double initialGuess, int maxIterationNumber)
14+
{
15+
this.maxDerivitive = maxDerivative;
16+
this.precision = precision;
17+
this.initialGuess = initialGuess;
18+
this.maxIterationNumber = maxIterationNumber;
19+
}
20+
421
@Override
522
public void calculate() {
6-
System.out.println("Calculating Based on fixed point iteration");
23+
System.out.println();
24+
System.out.println("----------------------------------------------------------------------------------");
25+
System.out.println("Calculating function: x = arctan(x)...... ");
26+
System.out.println("With initial guess: x0 = " + initialGuess);
27+
System.out.println("With precision: " + precision);
28+
System.out.println("With maximum derivative in interval [-2, 2]: " + maxDerivitive);
29+
System.out.println("With maximum iteration number, to prevent infinite loop: " + maxIterationNumber);
30+
System.out.println("----------------------------------------------------------------------------------");
31+
32+
List<Iteration> iterations = new ArrayList<Iteration>();
33+
Iteration iteration;
34+
double stopConditionAfter = ((1-maxDerivitive) / maxDerivitive) * precision;
35+
System.out.println("Stop Condition after: " + stopConditionAfter);
36+
37+
double stopConditionBefore = 100;
38+
double beforeResult;
39+
double result;
40+
41+
Object[][] data = new Object[maxIterationNumber][4];
42+
String[] columns = {"Iteration num.", "Variable x", "Result g(x)", "Difference |g(x) - x|"};
43+
44+
beforeResult = initialGuess;
45+
46+
for(int x = 0; (stopConditionBefore > stopConditionAfter) && (x <= maxIterationNumber - 1); x++)
47+
{
48+
// x = arctan(x)
49+
result = Math.atan(beforeResult) + 2*Math.PI;
50+
stopConditionBefore = Math.abs(result - beforeResult);
51+
52+
// Filling up the Iteration model with values
53+
iteration = new Iteration();
54+
iteration.iterationNum = x + 1;
55+
iteration.first_guess = beforeResult;
56+
iteration.result_funct = result;
57+
iteration.difference = stopConditionBefore;
58+
iterations.add(iteration);
59+
60+
// Setting variable for next iteration
61+
beforeResult = result;
62+
}
63+
64+
// Preparing for printing
65+
int iterNum = 0;
66+
for (Iteration iter : iterations){
67+
data[iterNum][0] = iter.iterationNum;
68+
data[iterNum][1] = iter.first_guess;
69+
data[iterNum][2] = iter.result_funct;
70+
data[iterNum][3] = iter.difference;
71+
iterNum++;
72+
}
73+
74+
TextTable tt = new TextTable(columns, data);
75+
tt.printTable();
76+
777
}
8-
}
78+
}

src/NumericalMethods/NonLinearMethodFactory.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,52 @@
11
package NumericalMethods;
22

33
public class NonLinearMethodFactory {
4+
5+
/* Fixed point iteration properties */
6+
// Initial guess, that user has to make
7+
public double intial_guess;
8+
// Calculated max derivative in defined interval
9+
public double maxDerivitive;
10+
// User defined precision
11+
public double iterationPrecision;
12+
// Max iteration number for iteration method, to prevent infinite loop
13+
public int maxIterationRepeatNumber;
14+
15+
/* Secant method properties */
16+
// First initial guess
17+
public double firstGuess;
18+
// Second initial guess
19+
public double secondGuess;
20+
// Max iteration number
21+
public int maxSecantRepeatNumber;
22+
// User defined precision
23+
public double secantPrecision;
24+
25+
public NonLinearMethodFactory(double initial_guess, double maxDerivitive, double iterationPrecision, int maxIterationRepeatNumber, double firstGuess, double secondGuess, int maxSecantRepeatNumber, double secantPrecision)
26+
{
27+
28+
// Initializing Iteration method properties & preparing factory class
29+
this.intial_guess = initial_guess;
30+
this.maxDerivitive = maxDerivitive;
31+
this.iterationPrecision = iterationPrecision;
32+
this.maxIterationRepeatNumber = maxIterationRepeatNumber;
33+
34+
// Initializing Secant method & preparing factory class
35+
this.firstGuess = firstGuess;
36+
this.secondGuess = secondGuess;
37+
this.maxSecantRepeatNumber = maxSecantRepeatNumber;
38+
this.secantPrecision = secantPrecision;
39+
}
40+
441
public NonLinearMethod getNonLinearMethod(String methodType)
542
{
643
if(methodType == "FixedPoint")
744
{
8-
return new FixedPointIteration();
45+
return new FixedPointIteration(maxDerivitive, iterationPrecision, intial_guess, maxIterationRepeatNumber);
946
}
1047
else if(methodType == "Secant")
1148
{
12-
return new Secant();
49+
return new Secant(secantPrecision, firstGuess, secondGuess, maxSecantRepeatNumber);
1350
}
1451
else
1552
{

0 commit comments

Comments
 (0)