using System; using System.Collections; namespace Science.Physics.GeneralPhysics { /// /// Circuit /// public class Circuit { public Circuit() { } private int j; public int NumberOfJunctions { get{return j;} set{j=value;} } private int n; private ArrayList[] segment; public int NumberOfSegments { get{return n;} set { n=value; segment = new ArrayList[n]; for(int i=0; i fun = new Calculus.Function(Func); double[] c = new double[ndim]; double[] dummy = Calculus.MinimumOfFunction(fun,c,100.0); } private double Func(double[] x) { int i = 0; for(int k = 0; k < NumberOfJunctions; k++) { if(vs[k].VariableQ) vs[k].V = x[i++]; } Resistance RR; ElectricPotentialDifference VV; for(int k = 0; k < NumberOfSegments; k++) { if(I[k].VariableQ) I[k].A = x[i++]; for(int kk = 0; kk < segment[k].Count; kk++) { if(segment[k][kk] is Resistance) { RR = (Resistance)segment[k][kk]; if(RR.VariableQ) RR.Ohm = x[i++]; } else { VV = (ElectricPotentialDifference)segment[k][kk]; if(VV.VariableQ) VV.V = x[i++]; } } } double sum = 0.0; for(int k = 0; k < NumberOfSegments; k++) { double potentialdiff = 0.0; for(int kk = 0; kk < segment[k].Count; kk++) { if(segment[k][kk] is Resistance) { RR = (Resistance)segment[k][kk]; potentialdiff -= RR.Ohm*I[k].A; } else { VV = (ElectricPotentialDifference)segment[k][kk]; potentialdiff += VV.V; } } sum += (vs[I[k].ToJunction].V - vs[I[k].FromJunction].V - potentialdiff)* (vs[I[k].ToJunction].V - vs[I[k].FromJunction].V - potentialdiff); } double[] currentatjunction = new double[NumberOfJunctions]; for(int k = 0; k < NumberOfSegments; k++) { currentatjunction[I[k].ToJunction] += I[k].A; currentatjunction[I[k].FromJunction] -= I[k].A; } for(int k = 0; k < NumberOfJunctions; k++) { sum += currentatjunction[k]*currentatjunction[k]; } return sum; } } }