From 2c4965239cc624c22de02c70a40c6def4cd61c83 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:05:51 -0300 Subject: [PATCH 01/20] Create RefactoringStep1 --- RefactoringStep1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 RefactoringStep1 diff --git a/RefactoringStep1 b/RefactoringStep1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/RefactoringStep1 @@ -0,0 +1 @@ + From 002847f25b0ee38202383e314143e33aaaf81aa5 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:07:39 -0300 Subject: [PATCH 02/20] Delete RefactoringStep1 --- RefactoringStep1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 RefactoringStep1 diff --git a/RefactoringStep1 b/RefactoringStep1 deleted file mode 100644 index 8b13789..0000000 --- a/RefactoringStep1 +++ /dev/null @@ -1 +0,0 @@ - From ee634020cf1516bb3cbbe3070501777f325c8ddb Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:10:10 -0300 Subject: [PATCH 03/20] Delete AbstractEarthPendulum.java --- .../dal/gravity/AbstractEarthPendulum.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/main/java/dal/gravity/AbstractEarthPendulum.java diff --git a/src/main/java/dal/gravity/AbstractEarthPendulum.java b/src/main/java/dal/gravity/AbstractEarthPendulum.java deleted file mode 100644 index 87b3460..0000000 --- a/src/main/java/dal/gravity/AbstractEarthPendulum.java +++ /dev/null @@ -1,23 +0,0 @@ -package dal.gravity; - - -/** - * Represents a pendulum on the planet Earth - */ -public abstract class AbstractEarthPendulum extends AbstractPendulum { - - /** gravitational constant */ - public static final double GRAVITY = 9.80665; - - /** - * Creates a new Pendulum instance using - * inLength: the string length (>0) - * inMass: the point mass (>0) - * inTheta0: angular displacement at t=0 (0<=theta0) - */ - public AbstractEarthPendulum (double inLength, double inMass, double inTheta0) { - super (inLength, inMass, inTheta0, GRAVITY); - } - -} - From 01380b756866196fd5cb4d5e050de678d2457c7b Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:14:14 -0300 Subject: [PATCH 04/20] Using Collapsed Hierarchy in first refactoring. --- AbstractPendulum.java | 49 +++++++++++++++++++++++++++++++++++++++++++ PendulumRunner.java | 39 ++++++++++++++++++++++++++++++++++ RegularPendulum.java | 44 ++++++++++++++++++++++++++++++++++++++ SimplePendulum.java | 40 +++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 AbstractPendulum.java create mode 100644 PendulumRunner.java create mode 100644 RegularPendulum.java create mode 100644 SimplePendulum.java diff --git a/AbstractPendulum.java b/AbstractPendulum.java new file mode 100644 index 0000000..cd14fe6 --- /dev/null +++ b/AbstractPendulum.java @@ -0,0 +1,49 @@ +package dal.gravity; + +/** + * + * Represents a pendulum + */ +public abstract class AbstractPendulum { + + + /* instance variables - string length, point mass, angular displacement + * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) + */ + private double stringLength, pointMass; + protected double theta0; + protected double g; + + /** + * Creates a new Pendulum instance using + * inLength: the string length (>0) + * inMass: the point mass (>0) + * inTheta0: angular displacement at t=0 (0<=theta0) + * inG: gravitational field value to use + */ + public AbstractPendulum (double inLength, double inMass, double inTheta0, double inG) { + if (validStringLength (inLength)) stringLength = inLength; + else throw new IllegalArgumentException ("invalid string length: " + inLength); + if (validPointMass(inMass)) pointMass = inMass; + else throw new IllegalArgumentException ("invalid point mass: " + inMass); + if (validDisplacement (inTheta0)) theta0 = inTheta0; + else throw new IllegalArgumentException + ("invalid angular displacement: " + inTheta0); + if (validGC (inG)) g = inG; + else throw new IllegalArgumentException ("invalid local gravitational field: " + inG); + } + + private boolean validDisplacement (double val) { return (val >= 0); } + private boolean validPointMass (double val) { return (val > 0); } + private boolean validStringLength (double val) { return (val > 0); } + private boolean validGC (double val) { return (val >= 0); } + + public double getMaxAngularDisplacement () { return theta0; } + + public double getPointMass () { return pointMass; } + + public double getStringLength () { return stringLength; } + + public double getGravitationalField () { return g; } + +} diff --git a/PendulumRunner.java b/PendulumRunner.java new file mode 100644 index 0000000..d549057 --- /dev/null +++ b/PendulumRunner.java @@ -0,0 +1,39 @@ +package dal.gravity; + +import java.text.NumberFormat; + +/** + * + * compares the values of a simple pendulum using the harmonic motion equation + * versus the Euler algorithm approximation + */ +public class PendulumRunner { + + public static void main (String [] args) { + NumberFormat nf = NumberFormat.getInstance (); + nf.setMaximumFractionDigits (3); + + double delta = (args.length == 0) ? .1 : Double.parseDouble (args[0]); + double sLen = 10, pMass = 10, theta0 = Math.PI/30; + RegularPendulum rp = new RegularPendulum (sLen, pMass, theta0, delta); + SimplePendulum sp = new SimplePendulum (sLen, pMass, theta0); + RegularPendulum rpCoarse = + new RegularPendulum (sLen, pMass, theta0, .1); + + // print out difference in displacement in 1 second intervals + // for 20 seconds + int iterations = (int) (1/delta); + System.out.println ("analytical vs. numerical displacement (fine, coarse)"); + for (int second = 1; second <= 20; second++) { + for (int i = 0; i < iterations; i++) rp.step (); + for (int i = 0; i < 10; i++) rpCoarse.step (); + System.out.println ("t=" + second + "s: \t" + + nf.format (Math.toDegrees (sp.getTheta (second))) + + "\t" + + nf.format (Math.toDegrees (rp.getLastTheta ())) + + "\t" + + nf.format (Math.toDegrees (rpCoarse.getLastTheta ()))); + } + } +} + diff --git a/RegularPendulum.java b/RegularPendulum.java new file mode 100644 index 0000000..36337b6 --- /dev/null +++ b/RegularPendulum.java @@ -0,0 +1,44 @@ +package dal.gravity; + +/** + * + * Represents a pendulum + */ +public class RegularPendulum extends AbstractEarthPendulum { + private double delta, iterations = 0; + private double dissipation; + private double lastTheta, lastVel, lastAccel; + + /** + * Creates a new Pendulum instance + */ + public RegularPendulum (double inLength, double inMass, double inTheta0, + double inDelta, double inDiss) { + super (inLength, inMass, inTheta0); + delta=inDelta; + dissipation = inDiss; + lastVel = 0; + lastTheta = this.getMaxAngularDisplacement (); + lastAccel = -(this.getGravitationalField () / this.getStringLength ())*Math.sin (lastTheta); + } + + public RegularPendulum (double inLength, double inMass, double inTheta0, + double inDelta) { + this (inLength, inMass, inTheta0, inDelta, 0); + } + + public void step () { + iterations++; + lastTheta = lastTheta + lastVel*delta; + lastVel = lastVel + lastAccel*delta; + lastAccel = - dissipation*lastVel - this.getGravitationalField () / this.getStringLength () * Math.sin (lastTheta); + } + + public double getLastTheta () { return lastTheta; } + public double getLastVelocity () { return lastVel; } + public double getLastAcceleration () { return lastAccel; } + public double getLastTime () { return iterations*delta; } + public double getDissipationConstant () { return dissipation; } + + +} diff --git a/SimplePendulum.java b/SimplePendulum.java new file mode 100644 index 0000000..67d5671 --- /dev/null +++ b/SimplePendulum.java @@ -0,0 +1,40 @@ +package dal.gravity; + +/** + * + * Represents pendulums exhibiting (approximately) simple harmonic motion + */ +public class SimplePendulum extends AbstractEarthPendulum { + + private double angularFrequency, periodOfMotion; + + /** + * Creates a new Pendulum instance using + * inLength: the string length (>0) + * inMass: the point mass (>0) + * inTheta0: angular displacement at t=0 (0<=theta0<=pi/6) + */ + public SimplePendulum (double inLength, double inMass, double inTheta0) { + super (inLength, inMass, inTheta0); + angularFrequency = Math.sqrt (this.getGravitationalField () / this.getStringLength ()); + periodOfMotion = 2 * Math.PI + * Math.sqrt (this.getStringLength () / this.getGravitationalField ()); + } + + /** + * provides this Pendulum's angular frequency + */ + public double getAngularFrequency () { return angularFrequency; } + + /** + * provides this Pendulum's period of motion + */ + public double getPeriodOfMotion () { return periodOfMotion; } + + /** + * provides the angular displacement of this Pendulum at time t + */ + public double getTheta (double t) { + return this.getMaxAngularDisplacement () * Math.cos (angularFrequency * t); + } +} From 2ba7681315666da10fd1a2d6206494f1134e78e4 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:15:56 -0300 Subject: [PATCH 05/20] Delete .gitignore --- .gitignore | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 32858aa..0000000 --- a/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* From 2bff0c6411d9bb70ad0aedad7be92a636ac25b2d Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:16:03 -0300 Subject: [PATCH 06/20] Delete RegularPendulum.java --- RegularPendulum.java | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 RegularPendulum.java diff --git a/RegularPendulum.java b/RegularPendulum.java deleted file mode 100644 index 36337b6..0000000 --- a/RegularPendulum.java +++ /dev/null @@ -1,44 +0,0 @@ -package dal.gravity; - -/** - * - * Represents a pendulum - */ -public class RegularPendulum extends AbstractEarthPendulum { - private double delta, iterations = 0; - private double dissipation; - private double lastTheta, lastVel, lastAccel; - - /** - * Creates a new Pendulum instance - */ - public RegularPendulum (double inLength, double inMass, double inTheta0, - double inDelta, double inDiss) { - super (inLength, inMass, inTheta0); - delta=inDelta; - dissipation = inDiss; - lastVel = 0; - lastTheta = this.getMaxAngularDisplacement (); - lastAccel = -(this.getGravitationalField () / this.getStringLength ())*Math.sin (lastTheta); - } - - public RegularPendulum (double inLength, double inMass, double inTheta0, - double inDelta) { - this (inLength, inMass, inTheta0, inDelta, 0); - } - - public void step () { - iterations++; - lastTheta = lastTheta + lastVel*delta; - lastVel = lastVel + lastAccel*delta; - lastAccel = - dissipation*lastVel - this.getGravitationalField () / this.getStringLength () * Math.sin (lastTheta); - } - - public double getLastTheta () { return lastTheta; } - public double getLastVelocity () { return lastVel; } - public double getLastAcceleration () { return lastAccel; } - public double getLastTime () { return iterations*delta; } - public double getDissipationConstant () { return dissipation; } - - -} From e200648f7a0694b3f765724c7a0091f1b1879dcd Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:16:10 -0300 Subject: [PATCH 07/20] Delete SimplePendulum.java --- SimplePendulum.java | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 SimplePendulum.java diff --git a/SimplePendulum.java b/SimplePendulum.java deleted file mode 100644 index 67d5671..0000000 --- a/SimplePendulum.java +++ /dev/null @@ -1,40 +0,0 @@ -package dal.gravity; - -/** - * - * Represents pendulums exhibiting (approximately) simple harmonic motion - */ -public class SimplePendulum extends AbstractEarthPendulum { - - private double angularFrequency, periodOfMotion; - - /** - * Creates a new Pendulum instance using - * inLength: the string length (>0) - * inMass: the point mass (>0) - * inTheta0: angular displacement at t=0 (0<=theta0<=pi/6) - */ - public SimplePendulum (double inLength, double inMass, double inTheta0) { - super (inLength, inMass, inTheta0); - angularFrequency = Math.sqrt (this.getGravitationalField () / this.getStringLength ()); - periodOfMotion = 2 * Math.PI - * Math.sqrt (this.getStringLength () / this.getGravitationalField ()); - } - - /** - * provides this Pendulum's angular frequency - */ - public double getAngularFrequency () { return angularFrequency; } - - /** - * provides this Pendulum's period of motion - */ - public double getPeriodOfMotion () { return periodOfMotion; } - - /** - * provides the angular displacement of this Pendulum at time t - */ - public double getTheta (double t) { - return this.getMaxAngularDisplacement () * Math.cos (angularFrequency * t); - } -} From 10f427246a9e5522b9fb27c63daa7dd308975ea8 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:16:19 -0300 Subject: [PATCH 08/20] Delete AbstractPendulum.java --- AbstractPendulum.java | 49 ------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 AbstractPendulum.java diff --git a/AbstractPendulum.java b/AbstractPendulum.java deleted file mode 100644 index cd14fe6..0000000 --- a/AbstractPendulum.java +++ /dev/null @@ -1,49 +0,0 @@ -package dal.gravity; - -/** - * - * Represents a pendulum - */ -public abstract class AbstractPendulum { - - - /* instance variables - string length, point mass, angular displacement - * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) - */ - private double stringLength, pointMass; - protected double theta0; - protected double g; - - /** - * Creates a new Pendulum instance using - * inLength: the string length (>0) - * inMass: the point mass (>0) - * inTheta0: angular displacement at t=0 (0<=theta0) - * inG: gravitational field value to use - */ - public AbstractPendulum (double inLength, double inMass, double inTheta0, double inG) { - if (validStringLength (inLength)) stringLength = inLength; - else throw new IllegalArgumentException ("invalid string length: " + inLength); - if (validPointMass(inMass)) pointMass = inMass; - else throw new IllegalArgumentException ("invalid point mass: " + inMass); - if (validDisplacement (inTheta0)) theta0 = inTheta0; - else throw new IllegalArgumentException - ("invalid angular displacement: " + inTheta0); - if (validGC (inG)) g = inG; - else throw new IllegalArgumentException ("invalid local gravitational field: " + inG); - } - - private boolean validDisplacement (double val) { return (val >= 0); } - private boolean validPointMass (double val) { return (val > 0); } - private boolean validStringLength (double val) { return (val > 0); } - private boolean validGC (double val) { return (val >= 0); } - - public double getMaxAngularDisplacement () { return theta0; } - - public double getPointMass () { return pointMass; } - - public double getStringLength () { return stringLength; } - - public double getGravitationalField () { return g; } - -} From b81577d31dbbd94c7e889631cd9fff4cc165ce5a Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:16:26 -0300 Subject: [PATCH 09/20] Delete PendulumRunner.java --- PendulumRunner.java | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 PendulumRunner.java diff --git a/PendulumRunner.java b/PendulumRunner.java deleted file mode 100644 index d549057..0000000 --- a/PendulumRunner.java +++ /dev/null @@ -1,39 +0,0 @@ -package dal.gravity; - -import java.text.NumberFormat; - -/** - * - * compares the values of a simple pendulum using the harmonic motion equation - * versus the Euler algorithm approximation - */ -public class PendulumRunner { - - public static void main (String [] args) { - NumberFormat nf = NumberFormat.getInstance (); - nf.setMaximumFractionDigits (3); - - double delta = (args.length == 0) ? .1 : Double.parseDouble (args[0]); - double sLen = 10, pMass = 10, theta0 = Math.PI/30; - RegularPendulum rp = new RegularPendulum (sLen, pMass, theta0, delta); - SimplePendulum sp = new SimplePendulum (sLen, pMass, theta0); - RegularPendulum rpCoarse = - new RegularPendulum (sLen, pMass, theta0, .1); - - // print out difference in displacement in 1 second intervals - // for 20 seconds - int iterations = (int) (1/delta); - System.out.println ("analytical vs. numerical displacement (fine, coarse)"); - for (int second = 1; second <= 20; second++) { - for (int i = 0; i < iterations; i++) rp.step (); - for (int i = 0; i < 10; i++) rpCoarse.step (); - System.out.println ("t=" + second + "s: \t" + - nf.format (Math.toDegrees (sp.getTheta (second))) - + "\t" + - nf.format (Math.toDegrees (rp.getLastTheta ())) - + "\t" + - nf.format (Math.toDegrees (rpCoarse.getLastTheta ()))); - } - } -} - From 245ec76339202b5a9baf857f26c8fbfac071187d Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:16:57 -0300 Subject: [PATCH 10/20] Delete AbstractPendulum.java --- .../java/dal/gravity/AbstractPendulum.java | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 src/main/java/dal/gravity/AbstractPendulum.java diff --git a/src/main/java/dal/gravity/AbstractPendulum.java b/src/main/java/dal/gravity/AbstractPendulum.java deleted file mode 100644 index 1b59a5a..0000000 --- a/src/main/java/dal/gravity/AbstractPendulum.java +++ /dev/null @@ -1,48 +0,0 @@ -package dal.gravity; - -/** - * Represents a pendulum - */ -public abstract class AbstractPendulum { - - - /* instance variables - string length, point mass, angular displacement - * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) - */ - private double stringLength, pointMass; - protected double theta0; - protected double g; - - /** - * Creates a new Pendulum instance using - * inLength: the string length (>0) - * inMass: the point mass (>0) - * inTheta0: angular displacement at t=0 (0<=theta0) - * inG: gravitational field value to use - */ - public AbstractPendulum (double inLength, double inMass, double inTheta0, double inG) { - if (validStringLength (inLength)) stringLength = inLength; - else throw new IllegalArgumentException ("invalid string length: " + inLength); - if (validPointMass(inMass)) pointMass = inMass; - else throw new IllegalArgumentException ("invalid point mass: " + inMass); - if (validDisplacement (inTheta0)) theta0 = inTheta0; - else throw new IllegalArgumentException - ("invalid angular displacement: " + inTheta0); - if (validGC (inG)) g = inG; - else throw new IllegalArgumentException ("invalid local gravitational field: " + inG); - } - - private boolean validDisplacement (double val) { return (val >= 0); } - private boolean validPointMass (double val) { return (val > 0); } - private boolean validStringLength (double val) { return (val > 0); } - private boolean validGC (double val) { return (val >= 0); } - - public double getMaxAngularDisplacement () { return theta0; } - - public double getPointMass () { return pointMass; } - - public double getStringLength () { return stringLength; } - - public double getGravitationalField () { return g; } - -} From bedbee4e0ce52d3682025866f8318de5dfc383ae Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:17:03 -0300 Subject: [PATCH 11/20] Delete PendulumRunner.java --- src/main/java/dal/gravity/PendulumRunner.java | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 src/main/java/dal/gravity/PendulumRunner.java diff --git a/src/main/java/dal/gravity/PendulumRunner.java b/src/main/java/dal/gravity/PendulumRunner.java deleted file mode 100644 index 2c61033..0000000 --- a/src/main/java/dal/gravity/PendulumRunner.java +++ /dev/null @@ -1,38 +0,0 @@ -package dal.gravity; - -import java.text.NumberFormat; - -/** - * compares the values of a simple pendulum using the harmonic motion equation - * versus the Euler algorithm approximation - */ -public class PendulumRunner { - - public static void main (String [] args) { - NumberFormat nf = NumberFormat.getInstance (); - nf.setMaximumFractionDigits (3); - - double delta = (args.length == 0) ? .1 : Double.parseDouble (args[0]); - double sLen = 10, pMass = 10, theta0 = Math.PI/30; - RegularPendulum rp = new RegularPendulum (sLen, pMass, theta0, delta); - SimplePendulum sp = new SimplePendulum (sLen, pMass, theta0); - RegularPendulum rpCoarse = - new RegularPendulum (sLen, pMass, theta0, .1); - - // print out difference in displacement in 1 second intervals - // for 20 seconds - int iterations = (int) (1/delta); - System.out.println ("analytical vs. numerical displacement (fine, coarse)"); - for (int second = 1; second <= 20; second++) { - for (int i = 0; i < iterations; i++) rp.step (); - for (int i = 0; i < 10; i++) rpCoarse.step (); - System.out.println ("t=" + second + "s: \t" + - nf.format (Math.toDegrees (sp.getTheta (second))) - + "\t" + - nf.format (Math.toDegrees (rp.getLastTheta ())) - + "\t" + - nf.format (Math.toDegrees (rpCoarse.getLastTheta ()))); - } - } -} - From 04f338226e5a4277fad3829f29c8455b6b6ed035 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:17:10 -0300 Subject: [PATCH 12/20] Delete RegularPendulum.java --- .../java/dal/gravity/RegularPendulum.java | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 src/main/java/dal/gravity/RegularPendulum.java diff --git a/src/main/java/dal/gravity/RegularPendulum.java b/src/main/java/dal/gravity/RegularPendulum.java deleted file mode 100644 index 65b9014..0000000 --- a/src/main/java/dal/gravity/RegularPendulum.java +++ /dev/null @@ -1,43 +0,0 @@ -package dal.gravity; - -/** - * Represents a pendulum - */ -public class RegularPendulum extends AbstractEarthPendulum { - private double delta, iterations = 0; - private double dissipation; - private double lastTheta, lastVel, lastAccel; - - /** - * Creates a new Pendulum instance - */ - public RegularPendulum (double inLength, double inMass, double inTheta0, - double inDelta, double inDiss) { - super (inLength, inMass, inTheta0); - delta=inDelta; - dissipation = inDiss; - lastVel = 0; - lastTheta = this.getMaxAngularDisplacement (); - lastAccel = -(this.getGravitationalField () / this.getStringLength ())*Math.sin (lastTheta); - } - - public RegularPendulum (double inLength, double inMass, double inTheta0, - double inDelta) { - this (inLength, inMass, inTheta0, inDelta, 0); - } - - public void step () { - iterations++; - lastTheta = lastTheta + lastVel*delta; - lastVel = lastVel + lastAccel*delta; - lastAccel = - dissipation*lastVel - this.getGravitationalField () / this.getStringLength () * Math.sin (lastTheta); - } - - public double getLastTheta () { return lastTheta; } - public double getLastVelocity () { return lastVel; } - public double getLastAcceleration () { return lastAccel; } - public double getLastTime () { return iterations*delta; } - public double getDissipationConstant () { return dissipation; } - - -} From c7c2db6745608a0ef48f5b7daf389dd283beb0c5 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:17:16 -0300 Subject: [PATCH 13/20] Delete SimplePendulum.java --- src/main/java/dal/gravity/SimplePendulum.java | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/main/java/dal/gravity/SimplePendulum.java diff --git a/src/main/java/dal/gravity/SimplePendulum.java b/src/main/java/dal/gravity/SimplePendulum.java deleted file mode 100644 index 5c7bf30..0000000 --- a/src/main/java/dal/gravity/SimplePendulum.java +++ /dev/null @@ -1,39 +0,0 @@ -package dal.gravity; - -/** - * Represents pendulums exhibiting (approximately) simple harmonic motion - */ -public class SimplePendulum extends AbstractEarthPendulum { - - private double angularFrequency, periodOfMotion; - - /** - * Creates a new Pendulum instance using - * inLength: the string length (>0) - * inMass: the point mass (>0) - * inTheta0: angular displacement at t=0 (0<=theta0<=pi/6) - */ - public SimplePendulum (double inLength, double inMass, double inTheta0) { - super (inLength, inMass, inTheta0); - angularFrequency = Math.sqrt (this.getGravitationalField () / this.getStringLength ()); - periodOfMotion = 2 * Math.PI - * Math.sqrt (this.getStringLength () / this.getGravitationalField ()); - } - - /** - * provides this Pendulum's angular frequency - */ - public double getAngularFrequency () { return angularFrequency; } - - /** - * provides this Pendulum's period of motion - */ - public double getPeriodOfMotion () { return periodOfMotion; } - - /** - * provides the angular displacement of this Pendulum at time t - */ - public double getTheta (double t) { - return this.getMaxAngularDisplacement () * Math.cos (angularFrequency * t); - } -} From b4e8fdba47e3e0d334fa63b659f19e48914ad625 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:18:30 -0300 Subject: [PATCH 14/20] Create Gravity --- Gravity | 1 + 1 file changed, 1 insertion(+) create mode 100644 Gravity diff --git a/Gravity b/Gravity new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Gravity @@ -0,0 +1 @@ + From 0bc6340e3a95eb9089098944df340040ec2d9b16 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:18:43 -0300 Subject: [PATCH 15/20] Delete Gravity --- Gravity | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Gravity diff --git a/Gravity b/Gravity deleted file mode 100644 index 8b13789..0000000 --- a/Gravity +++ /dev/null @@ -1 +0,0 @@ - From d0619ff95e447052c8464c12e64ae3444aa0b2db Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:56:02 -0300 Subject: [PATCH 16/20] change the gravity constant and get the value --- AbstractPendulum.java | 49 +++++++++++++++++++++++++++++++++++++++++++ PendulumRunner.java | 39 ++++++++++++++++++++++++++++++++++ RegularPendulum.java | 44 ++++++++++++++++++++++++++++++++++++++ SimplePendulum.java | 40 +++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 AbstractPendulum.java create mode 100644 PendulumRunner.java create mode 100644 RegularPendulum.java create mode 100644 SimplePendulum.java diff --git a/AbstractPendulum.java b/AbstractPendulum.java new file mode 100644 index 0000000..cd14fe6 --- /dev/null +++ b/AbstractPendulum.java @@ -0,0 +1,49 @@ +package dal.gravity; + +/** + * + * Represents a pendulum + */ +public abstract class AbstractPendulum { + + + /* instance variables - string length, point mass, angular displacement + * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) + */ + private double stringLength, pointMass; + protected double theta0; + protected double g; + + /** + * Creates a new Pendulum instance using + * inLength: the string length (>0) + * inMass: the point mass (>0) + * inTheta0: angular displacement at t=0 (0<=theta0) + * inG: gravitational field value to use + */ + public AbstractPendulum (double inLength, double inMass, double inTheta0, double inG) { + if (validStringLength (inLength)) stringLength = inLength; + else throw new IllegalArgumentException ("invalid string length: " + inLength); + if (validPointMass(inMass)) pointMass = inMass; + else throw new IllegalArgumentException ("invalid point mass: " + inMass); + if (validDisplacement (inTheta0)) theta0 = inTheta0; + else throw new IllegalArgumentException + ("invalid angular displacement: " + inTheta0); + if (validGC (inG)) g = inG; + else throw new IllegalArgumentException ("invalid local gravitational field: " + inG); + } + + private boolean validDisplacement (double val) { return (val >= 0); } + private boolean validPointMass (double val) { return (val > 0); } + private boolean validStringLength (double val) { return (val > 0); } + private boolean validGC (double val) { return (val >= 0); } + + public double getMaxAngularDisplacement () { return theta0; } + + public double getPointMass () { return pointMass; } + + public double getStringLength () { return stringLength; } + + public double getGravitationalField () { return g; } + +} diff --git a/PendulumRunner.java b/PendulumRunner.java new file mode 100644 index 0000000..d549057 --- /dev/null +++ b/PendulumRunner.java @@ -0,0 +1,39 @@ +package dal.gravity; + +import java.text.NumberFormat; + +/** + * + * compares the values of a simple pendulum using the harmonic motion equation + * versus the Euler algorithm approximation + */ +public class PendulumRunner { + + public static void main (String [] args) { + NumberFormat nf = NumberFormat.getInstance (); + nf.setMaximumFractionDigits (3); + + double delta = (args.length == 0) ? .1 : Double.parseDouble (args[0]); + double sLen = 10, pMass = 10, theta0 = Math.PI/30; + RegularPendulum rp = new RegularPendulum (sLen, pMass, theta0, delta); + SimplePendulum sp = new SimplePendulum (sLen, pMass, theta0); + RegularPendulum rpCoarse = + new RegularPendulum (sLen, pMass, theta0, .1); + + // print out difference in displacement in 1 second intervals + // for 20 seconds + int iterations = (int) (1/delta); + System.out.println ("analytical vs. numerical displacement (fine, coarse)"); + for (int second = 1; second <= 20; second++) { + for (int i = 0; i < iterations; i++) rp.step (); + for (int i = 0; i < 10; i++) rpCoarse.step (); + System.out.println ("t=" + second + "s: \t" + + nf.format (Math.toDegrees (sp.getTheta (second))) + + "\t" + + nf.format (Math.toDegrees (rp.getLastTheta ())) + + "\t" + + nf.format (Math.toDegrees (rpCoarse.getLastTheta ()))); + } + } +} + diff --git a/RegularPendulum.java b/RegularPendulum.java new file mode 100644 index 0000000..36337b6 --- /dev/null +++ b/RegularPendulum.java @@ -0,0 +1,44 @@ +package dal.gravity; + +/** + * + * Represents a pendulum + */ +public class RegularPendulum extends AbstractEarthPendulum { + private double delta, iterations = 0; + private double dissipation; + private double lastTheta, lastVel, lastAccel; + + /** + * Creates a new Pendulum instance + */ + public RegularPendulum (double inLength, double inMass, double inTheta0, + double inDelta, double inDiss) { + super (inLength, inMass, inTheta0); + delta=inDelta; + dissipation = inDiss; + lastVel = 0; + lastTheta = this.getMaxAngularDisplacement (); + lastAccel = -(this.getGravitationalField () / this.getStringLength ())*Math.sin (lastTheta); + } + + public RegularPendulum (double inLength, double inMass, double inTheta0, + double inDelta) { + this (inLength, inMass, inTheta0, inDelta, 0); + } + + public void step () { + iterations++; + lastTheta = lastTheta + lastVel*delta; + lastVel = lastVel + lastAccel*delta; + lastAccel = - dissipation*lastVel - this.getGravitationalField () / this.getStringLength () * Math.sin (lastTheta); + } + + public double getLastTheta () { return lastTheta; } + public double getLastVelocity () { return lastVel; } + public double getLastAcceleration () { return lastAccel; } + public double getLastTime () { return iterations*delta; } + public double getDissipationConstant () { return dissipation; } + + +} diff --git a/SimplePendulum.java b/SimplePendulum.java new file mode 100644 index 0000000..67d5671 --- /dev/null +++ b/SimplePendulum.java @@ -0,0 +1,40 @@ +package dal.gravity; + +/** + * + * Represents pendulums exhibiting (approximately) simple harmonic motion + */ +public class SimplePendulum extends AbstractEarthPendulum { + + private double angularFrequency, periodOfMotion; + + /** + * Creates a new Pendulum instance using + * inLength: the string length (>0) + * inMass: the point mass (>0) + * inTheta0: angular displacement at t=0 (0<=theta0<=pi/6) + */ + public SimplePendulum (double inLength, double inMass, double inTheta0) { + super (inLength, inMass, inTheta0); + angularFrequency = Math.sqrt (this.getGravitationalField () / this.getStringLength ()); + periodOfMotion = 2 * Math.PI + * Math.sqrt (this.getStringLength () / this.getGravitationalField ()); + } + + /** + * provides this Pendulum's angular frequency + */ + public double getAngularFrequency () { return angularFrequency; } + + /** + * provides this Pendulum's period of motion + */ + public double getPeriodOfMotion () { return periodOfMotion; } + + /** + * provides the angular displacement of this Pendulum at time t + */ + public double getTheta (double t) { + return this.getMaxAngularDisplacement () * Math.cos (angularFrequency * t); + } +} From bc655a5ab18dff2f3e4d30b8ac1a40954df418f1 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:57:11 -0300 Subject: [PATCH 17/20] Update AbstractPendulum.java --- AbstractPendulum.java | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/AbstractPendulum.java b/AbstractPendulum.java index cd14fe6..6cd2c34 100644 --- a/AbstractPendulum.java +++ b/AbstractPendulum.java @@ -1,36 +1,42 @@ package dal.gravity; /** - * * Represents a pendulum */ public abstract class AbstractPendulum { - + /* instance variables - string length, point mass, angular displacement * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) */ + public static double gravity = 9.80665; private double stringLength, pointMass; protected double theta0; - protected double g; + public interface gravityInter { + public static void GravityConstant(double gra) { + gravity = gra; + } + public static double getGravitationalField() { + return gravity; + } + } /** * Creates a new Pendulum instance using * inLength: the string length (>0) * inMass: the point mass (>0) * inTheta0: angular displacement at t=0 (0<=theta0) - * inG: gravitational field value to use + * GRAVITY: Always the gravitational field value to use from now on. Replaces inG. */ - public AbstractPendulum (double inLength, double inMass, double inTheta0, double inG) { + public AbstractPendulum (double inLength, double inMass, double inTheta0) { if (validStringLength (inLength)) stringLength = inLength; else throw new IllegalArgumentException ("invalid string length: " + inLength); if (validPointMass(inMass)) pointMass = inMass; else throw new IllegalArgumentException ("invalid point mass: " + inMass); if (validDisplacement (inTheta0)) theta0 = inTheta0; - else throw new IllegalArgumentException - ("invalid angular displacement: " + inTheta0); - if (validGC (inG)) g = inG; - else throw new IllegalArgumentException ("invalid local gravitational field: " + inG); + else throw new IllegalArgumentException ("invalid angular displacement: " + inTheta0); + if (validGC (gravity)) gravityInter.getGravitationalField(); + else throw new IllegalArgumentException ("invalid local gravitational field: " + gravity); } private boolean validDisplacement (double val) { return (val >= 0); } @@ -43,7 +49,6 @@ public AbstractPendulum (double inLength, double inMass, double inTheta0, double public double getPointMass () { return pointMass; } public double getStringLength () { return stringLength; } - - public double getGravitationalField () { return g; } - + + public double grav = gravityInter.getGravitationalField();//get the grav number in the gravityInter } From 9ccb8343bf40cb0e554db83be854351371731edb Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:58:02 -0300 Subject: [PATCH 18/20] change the gravity constant and get the value --- AbstractPendulum.java | 1 - 1 file changed, 1 deletion(-) diff --git a/AbstractPendulum.java b/AbstractPendulum.java index 6cd2c34..28b4cbb 100644 --- a/AbstractPendulum.java +++ b/AbstractPendulum.java @@ -4,7 +4,6 @@ * Represents a pendulum */ public abstract class AbstractPendulum { - /* instance variables - string length, point mass, angular displacement * at t=0, constant for local gravitational field in m/s^2 (e.g., 9.81 on Earth) From deab16a3fb43861b9646e38bfd50345f28e69e4a Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 13:59:32 -0300 Subject: [PATCH 19/20] change the gravity constant and get the value --- RegularPendulum.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RegularPendulum.java b/RegularPendulum.java index 36337b6..6248e55 100644 --- a/RegularPendulum.java +++ b/RegularPendulum.java @@ -19,7 +19,7 @@ public RegularPendulum (double inLength, double inMass, double inTheta0, dissipation = inDiss; lastVel = 0; lastTheta = this.getMaxAngularDisplacement (); - lastAccel = -(this.getGravitationalField () / this.getStringLength ())*Math.sin (lastTheta); + lastAccel = -(grav/ this.getStringLength ())*Math.sin (lastTheta); } public RegularPendulum (double inLength, double inMass, double inTheta0, @@ -31,7 +31,7 @@ public void step () { iterations++; lastTheta = lastTheta + lastVel*delta; lastVel = lastVel + lastAccel*delta; - lastAccel = - dissipation*lastVel - this.getGravitationalField () / this.getStringLength () * Math.sin (lastTheta); + lastAccel = - dissipation*lastVel - grav/ this.getStringLength () * Math.sin (lastTheta); } public double getLastTheta () { return lastTheta; } From 7c9b6971b0cf7d59b9dc9d8da7be4e0628615256 Mon Sep 17 00:00:00 2001 From: LLLZhao <1005570863@qq.com> Date: Tue, 4 Apr 2017 14:00:14 -0300 Subject: [PATCH 20/20] change the gravity constant and get the value --- SimplePendulum.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SimplePendulum.java b/SimplePendulum.java index 67d5671..da78500 100644 --- a/SimplePendulum.java +++ b/SimplePendulum.java @@ -16,9 +16,9 @@ public class SimplePendulum extends AbstractEarthPendulum { */ public SimplePendulum (double inLength, double inMass, double inTheta0) { super (inLength, inMass, inTheta0); - angularFrequency = Math.sqrt (this.getGravitationalField () / this.getStringLength ()); + angularFrequency = Math.sqrt (grav/ this.getStringLength ()); periodOfMotion = 2 * Math.PI - * Math.sqrt (this.getStringLength () / this.getGravitationalField ()); + * Math.sqrt (this.getStringLength () / grav); } /**