using System; namespace Science.Physics.GeneralPhysics { /// /// PotentialEnergy U related with work W as /// W = - Delta U = U_{i} - U_{f}. /// public class PotentialEnergy : Scalar { private void SetDim() { this.DimensionMass = 1; this.DimensionLength = 2; this.DimensionTime = -2; } public PotentialEnergy() { SetDim(); } public PotentialEnergy(ElectricCharge q0, ElectricPotential V) { SetDim(); this.Magnitude = q0.C*V.V; } public PotentialEnergy(Capacitance C, ElectricPotentialDifference V) { SetDim(); this.Magnitude = 0.5*C.F*V.V*V.V; } public PotentialEnergy(Capacitance C, ElectricCharge Q) { SetDim(); this.Magnitude = 0.5/C.F*Q.C*Q.C; } private double[] x = new double[3]; public void At(Position r) { this.Set(r); } public double J { get{return this.Magnitude;} set{this.Magnitude=value;} } public double Difference(Position from, Position to) { this.Set(from); double Ui = this.Magnitude; this.Set(to); double Uf = this.Magnitude; return Uf - Ui; } private Force force; private double Ui = 0.0, Uf; public PotentialEnergy(Force f, Position referencePosition,PotentialEnergy referenceValue) { SetDim(); force = f; x[0] = referencePosition.X; x[1] = referencePosition.Y; x[2] = referencePosition.Z; Ui = referenceValue.Magnitude; } private double[] xx = new Double[3]; public double ValueAt(Position r) { xx[0] = r.X; xx[1] = r.Y; xx[2] = r.Z; Line.Parameterization fun = new Line.Parameterization(rvst); Line p = new Line(); p.ParameterToPosition = fun; p.ParameterStartValue = 0.0; p.ParameterEndValue = 1.0; Work w = new Work(force,p); Uf = -w.J + Ui; return Uf; } private Position rvst(double t) { double[] r = new double[3]; for(int i = 0; i < 3; i++) r[i] = (xx[i] - x[i])*t+x[i]; Position p = new Position(); p.X = r[0]; p.Y = r[1]; p.Z = r[2]; return p; } public override string ToString() { return base.ToString() + "(J)"; } } }