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;
}
}
}