Gaussian Elimination

advertisement
Gaussian Elimination
N equations in N unknowns (x, y, z)
A,B,C,D are known constants:
A1x + B1y + C1z = D1
A2x + B2y + C2z = D2
A3x + B3y + C3z = D3
Put the constants into a matrix:
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
Use linear operators to transform the matrix to:
1 0 0 Dx
0 1 0 Dy
0 0 1 Dz
Dx, Dy Dz are the values for x y and z that make the first equations true – thus
solving the equations.
Gaussian Elimination
Two basic linear operations used on matrix:
• */ by constant
• add/sub rows from each other:
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
Divide first row by A1, becomes:
1 B1/A1 C1/A1 D1/A1
Subtract A2 times first row from second row, becomes:
0 B2-B1A2 C2-C1A2 D2-D1A2
Subtract A3 times first row from third row, becomes:
0 B3-B1A3 C3-C1A3 D3-D1A3
Now we have the first column in the right form, continue with second row, second
column, etc.
Gaussian Elimination
int gauss(double **M, int maxrow, int maxcol) {
int diag, row, col;
double pivot, pivot2;
for (diag = 0; diag < maxrow; diag++) { /* for each row = variable = diagonal element */
pivot = M[diag][diag];
if (pivot == 0) { printf("Gauss: Singular Matrix!\n"); return(1); }
for (col = diag; col < maxcol; col++) {
/* from diagonal to right, divide out by the pivot diagonal element */
M[diag][col] /= pivot;
}
for(row = 0; row < maxrow; row++)
/* for all other rows subtract scalled diag row, zeroing pivot column */
if (row != diag) {
{
/* scale all elements of diag row by value which will zero
diag element of this row, and subtract from this row */
pivot2 = M[row][diag];
for (col = diag; col < maxcol; col++)
M[row][col] -= M[diag][col]*pivot2;
}
}
return(0);
}
Nodal Analysis: NA
For a linear circuit, solve Kirchhoff's current law (KCL) and
voltage law (KVL) using a matrix formulation, just Ohm’s
law in a matrix:
|G| x |V| = |I|
G is conduction matrix (1/R)
V is vector of unknown node voltages
I is vector of known node currents
Solve by inverting G and then multiplying I to get V
or concatenating |G||I| and performing Gaussian elimination
(or equivalent) to get V
Assumes G and I are constant
Modified Nodal Analysis: MNA
•
•
Adds voltage sources to circuits
Matrices are a little more complex, solution is the same
AX = Z
• General form of linear equations:
• used for a lot of systems beyond circuits
• A matrix is conduction and voltage sources
• G is conduction, B is voltages C = BT, D = 0
• X is unknown voltages and currents
⎡G B ⎤
• Z is known voltages, currents
⎡i ⎤
⎡v ⎤
X =⎢ ⎥ Z =⎢ ⎥
A=⎢
⎥
⎣ j⎦
⎣e ⎦
⎣C D ⎦
•Solve by matrix inversion and multiplication:
−1
A Z=X
⎡G B ⎤
⎢C D ⎥
⎣
⎦
−1
⎡i ⎤ ⎡v ⎤
×⎢ ⎥ = ⎢ ⎥
⎣e ⎦ ⎣ j ⎦
Conduction Matrix
• G is matrix of conductions (1/R) = g
• For each impedance:
• if R is on node k, add value of 1/R on
diagonal (k,k).
– If other end of R is on ground, stop
– Else, if R is on node j add 1/R to other
diagonal (j,j) and add (-1/R) on elements (k,j)
and (j,k)
Voltage Source Matrices
• B has a column for each voltage source, V
• If V has a positive terminal on node j, put 1
in row j.
– If other end of V is on ground, stop
– Else, if V has a negative terminal on node k
put -1 on row k
• C is B transpose (row for each source…)
• D (corner) is zero if no dependent sources
Vector of Unknowns
• X is composed of the unknown node
voltages and voltage source currents.
• Vk for each unknown voltage at node k
• Ji for the current through each voltage
source i (in the direction of positive
terminal through the device to the
negative terminal).
Vector of Knowns
• Z is composed of the known node currents and
voltage source voltages.
• Ik for each known current at node k. This is zero
unless there is a current source at node k. if so,
the value is +current positive node. If other end
is not on ground, then value is –current at other
node.
• Vj for the value of voltage source j. If other end is
not on ground, then value of –voltage at other
node.
Example Circuit
AX = Z
1 100
−1 100
0
0
1
−1 100 1 100+1 200+1 400 −1 200
0
0
0
−1 200
1 200
0
0
0
1
0
0
0
0
1 300 0
0 0
v1
0
v2
0
× v3 = 100mA
v4 −100mA
ivs
5V
Example Circuit
⎡G B ⎤
A=⎢
⎥
⎣C D ⎦
n1
n2
n3
n4
v1
n1
0.01
-0.01
0
0
1
n2
-0.01
0.0175
-0.005
0
0
n3
n4
0
0
-0.005
0
0.005
0
0 0.003333
0
0
v1
1
0
0
0
0
Example Circuit
5V
32V
12V
-30V
70mA
⎡G B ⎤
⎥
⎢
⎣C D ⎦
0
0
0
0
1
0
80
80
0
0.8
0
80
280
0
0.8
−1
A Z=X
−1
⎡i ⎤
×⎢ ⎥
⎣e ⎦
0
0
0
300
0
1
0.8
0.8
0
-0.002
X
0
0
0.1
-0.1
5
⎡v ⎤
=⎢ ⎥
⎣ j⎦
5
12
=
32
-30
0.07
Energy Storage
• Capacitors and Inductors store energy and
thus have voltage (current) dependent
conductance:
g (t ) = i (t ) / v(t )
• Capacitor:
1
v(t ) =
C
t
∫
0
q (t )
i (t )dt =
C
dq (t )
dv(t )
i (t ) =
=C
dt
dt
• Inductor:
t
∫
1
i (t ) =
v(t )dt
L
0
di (t )
v(t ) = L
dt
Need to do numerical integration
x ’n
Two rectangular rules for integration
• xn+1 = xn + h*x’n ( forward Euler)
• xn+1 = xn + h*x’n+1 ( backward
Euler)
Many others: Trapezoid, Gear,
Simpson
Use for integration for charge storage:
vn+1 = vn+ h * v’n+1
vn+1 = vn+ h/c * in+1
Rearrange:
In+1 = (c/h)* vn+1 – (c/h) * vn
Define: Geq = c/h
Gives a Norton Equivalent circuit:
xn
xn+1
h
x’n+1
Capacitor companion model in
MNA
Geq − Geq V n +1 + − Ieq
=
×
− Geq Geq V n +1 − + Ieq
• Adds companion model (Norton equivalent
circuit) to G, X and Z matrices.
• Note signs of Ieq nodes
• Ieq must be re-calculated after each time
step:
Ieqn+1 = (V+n+1-V-n+1) * C/h
If h changes, then Geq = C/h must be re-calculated
too!
Download