testcases
This commit is contained in:
parent
55e7774128
commit
430d10f244
|
|
@ -0,0 +1,52 @@
|
||||||
|
* test asrc branch current, tran, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
BR1 in N3 i = v(in,N3)/1.0 $ artificial 1 Ohm Resistor
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
C1 N5 0 0.21
|
||||||
|
|
||||||
|
B1 out 0 V = I(BR1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
plot v(out) i(Vm1)*0.99
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 1.0
|
||||||
|
let C = 0.21
|
||||||
|
let tau = R * C
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega)*ot + cos(time*omega) - exp(-time/tau)) * ot/(1+ot*ot)/R
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 4e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1)*0.99 gold*0.97
|
||||||
|
plot v(out)-gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
* test capacitor branch current, ac, without feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1) ac = 2.31
|
||||||
|
|
||||||
|
C1 in N3 0.07 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 1.0
|
||||||
|
|
||||||
|
B1 out 0 V = I(C1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
ac dec 20 0.01 100
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer
|
||||||
|
let R = 1
|
||||||
|
let C = 0.07 * 3
|
||||||
|
let tau = R * C
|
||||||
|
let s = (0,1) * 2 * pi * frequency
|
||||||
|
let gold = 2.31 / R * s*tau/(1 + s*tau)
|
||||||
|
|
||||||
|
let ac_err = v(out) / gold - 1
|
||||||
|
let ac_max_err = vecmax(abs(ac_err))
|
||||||
|
|
||||||
|
echo "INFO: ac_max_err =" $&ac_max_err
|
||||||
|
|
||||||
|
if ac_max_err > 1e-12
|
||||||
|
echo "ERROR: ac test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: ac success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot vdb(out) db(abs(i(Vm1)))*0.99 db(abs(gold))*0.98
|
||||||
|
plot abs(ac_err)
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
* test capacitor branch current, ac, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1) ac = 2.31
|
||||||
|
|
||||||
|
C1 in N3 0.07 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(C1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(C1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
ac dec 20 0.01 100
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer
|
||||||
|
let R = 1
|
||||||
|
let C = 0.07 * 3
|
||||||
|
let tau = R * C
|
||||||
|
let s = (0,1) * 2 * pi * frequency
|
||||||
|
let gold = 2.31 / R * s*tau/(1 + s*tau)
|
||||||
|
|
||||||
|
let ac_err = v(out) / gold - 1
|
||||||
|
let ac_max_err = vecmax(abs(ac_err))
|
||||||
|
|
||||||
|
echo "INFO: ac_max_err =" $&ac_max_err
|
||||||
|
|
||||||
|
if ac_max_err > 1e-15
|
||||||
|
echo "ERROR: ac test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: ac success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot vdb(out) db(abs(i(Vm1)))*0.99 db(abs(gold))*0.98
|
||||||
|
plot abs(ac_err)
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
* test capacitor branch current, pz, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 ac = 2.31
|
||||||
|
|
||||||
|
C1 in N3 0.07 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(C1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(C1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
pz in 0 out 0 vol pz
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer
|
||||||
|
let R = 1
|
||||||
|
let C = 0.07 * 3
|
||||||
|
let tau = R * C
|
||||||
|
let gold_pole = (-1,0)/tau
|
||||||
|
let gold_zero = (0,0)
|
||||||
|
|
||||||
|
let pole_err = abs(pole(1)/gold_pole - 1)
|
||||||
|
let zero_err = abs(zero(1))
|
||||||
|
|
||||||
|
echo "INFO: pole_err =" $&pole_err
|
||||||
|
echo "INFO: zero_err =" $&zero_err
|
||||||
|
|
||||||
|
if pole_err > 1e-6
|
||||||
|
echo "ERROR: pz/pole test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: pz/pole success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if zero_err > 1e-6
|
||||||
|
echo "ERROR: pz/zero test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: pz/zero success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
print pole(1) zero(1) gold_pole gold_zero
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
* test capacitor branch current, tran, without feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
C1 in N3 0.07 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 1.0
|
||||||
|
|
||||||
|
B1 out 0 V = I(C1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 1
|
||||||
|
let C = 0.07 * 3
|
||||||
|
let tau = R * C
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega)*ot + cos(time*omega) - exp(-time/tau)) * ot/(1+ot*ot)/R
|
||||||
|
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 4e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1)*0.99 v(N5)*0.98 gold*0.97
|
||||||
|
plot v(out)-gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
/* R in series with C feed with vin*sin(omega*t) */
|
||||||
|
|
||||||
|
assume(omega > 0);
|
||||||
|
|
||||||
|
vsource: laplace(vin*sin(t*omega), t, s);
|
||||||
|
iout: vsource/R * s*tau/(1 + s*tau);
|
||||||
|
ilt(iout, s, t), factor;
|
||||||
|
|
||||||
|
f1: vin/R / (1 + (omega*tau)^2);
|
||||||
|
f2: %th(2) / f1;
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
* test capacitor branch current, tran, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
C1 in N3 0.07 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(C1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(C1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 1
|
||||||
|
let C = 0.07 * 3
|
||||||
|
let tau = R * C
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega)*ot + cos(time*omega) - exp(-time/tau)) * ot/(1+ot*ot)/R
|
||||||
|
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 4e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1)*0.99 v(N5)*0.98 gold*0.97
|
||||||
|
plot v(out)-gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
* test inductor branch current, ac, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 ac = 2.31
|
||||||
|
|
||||||
|
L1 in N3 0.21 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(L1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(L1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
ac dec 20 0.01 100
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer
|
||||||
|
let R = 1
|
||||||
|
let L = 0.21 / 3
|
||||||
|
let tau = L / R
|
||||||
|
let s = (0,2) * pi * frequency
|
||||||
|
let gold = 2.31/R * 1/(1 + s*tau)
|
||||||
|
|
||||||
|
let ac_err = v(out) / gold - 1
|
||||||
|
let ac_max_err = vecmax(abs(ac_err))
|
||||||
|
|
||||||
|
echo "INFO: ac_max_err =" $&ac_max_err
|
||||||
|
|
||||||
|
if ac_max_err > 1e-12
|
||||||
|
echo "ERROR: ac test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: ac success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot vdb(out) db(abs(i(Vm1)))*0.99 db(abs(gold))*0.98
|
||||||
|
plot abs(ac_err)
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
* test inductor branch current, pz, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 ac = 2.31
|
||||||
|
|
||||||
|
L1 in N3 0.21 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(L1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(L1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
pz in 0 out 0 vol pz
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer
|
||||||
|
let R = 1
|
||||||
|
let L = 0.21 / 3
|
||||||
|
let tau = L / R
|
||||||
|
let gold_pole = (-1,0)/tau
|
||||||
|
|
||||||
|
let pole_err = abs(pole(1)/gold_pole - 1)
|
||||||
|
|
||||||
|
echo "INFO: pole_err =" $&pole_err
|
||||||
|
|
||||||
|
if pole_err > 1e-6
|
||||||
|
echo "ERROR: pz/pole test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: pz/pole success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
print pole(1) gold_pole
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
* test inductor branch current, tran, without feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
L1 in N3 0.21 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 1.0
|
||||||
|
|
||||||
|
B1 out 0 V = I(L1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 1
|
||||||
|
let L = 0.21 / 3
|
||||||
|
let tau = L / R
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega) - ot*cos(time*omega) + ot*exp(-time/tau)) / (1+ot*ot)/R
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 6e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1)*0.99 v(N5)*0.98 gold*0.97
|
||||||
|
plot v(out)-gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
/* R in series with L feed with vin*sin(omega*t) */
|
||||||
|
|
||||||
|
assume(omega > 0);
|
||||||
|
|
||||||
|
vsource: laplace(vin*sin(t*omega), t, s);
|
||||||
|
iout: vsource/R * 1/(1 + s*tau);
|
||||||
|
ilt(iout, s, t), factor;
|
||||||
|
|
||||||
|
f1: vin/R / (1 + (omega*tau)^2);
|
||||||
|
f2: %th(2) / f1;
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
* test inductor branch current, tran, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
L1 in N3 0.21 m = 3
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
R2 N5 0 2.42
|
||||||
|
B2 N5 0 V = I(L1) $ extends R2 for a total of 1 Ohm
|
||||||
|
|
||||||
|
B1 out 0 V = I(L1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 1
|
||||||
|
let L = 0.21 / 3
|
||||||
|
let tau = L / R
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega) - ot*cos(time*omega) + ot*exp(-time/tau)) / (1+ot*ot)/R
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 6e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1)*0.99 gold*0.97
|
||||||
|
plot v(out)-gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
* test resistor branch current, ac, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 dc=3.0 ac=2.31
|
||||||
|
|
||||||
|
R1 in out 1
|
||||||
|
B1 out 0 v = i(R1)^3
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* for more newton iterations, and increased precision, try
|
||||||
|
* set reltol = 1e-15
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
ac dec 20 0.01 100
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let gold_dc_out = 1.786588337237788
|
||||||
|
let gold_ac_out = 2.31 * 0.81539950577107
|
||||||
|
|
||||||
|
let dc_err = op1.v(out) / gold_dc_out - 1
|
||||||
|
let ac_err = v(out) / gold_ac_out - 1
|
||||||
|
|
||||||
|
let ac_max_err = vecmax(abs(ac_err))
|
||||||
|
|
||||||
|
echo "INFO: dc_err =" $&dc_err
|
||||||
|
echo "INFO: ac_max_err =" $&ac_max_err
|
||||||
|
|
||||||
|
if abs(dc_err) > 1e-6
|
||||||
|
echo "ERROR: dc test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: dc success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if ac_max_err > 1e-6
|
||||||
|
echo "ERROR: ac test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: ac success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot abs(ac_err)
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* vin ---R---+---- vout
|
||||||
|
* |
|
||||||
|
* u = i^3
|
||||||
|
* |
|
||||||
|
*/
|
||||||
|
|
||||||
|
batch("./bc-res-tran-2.maxima");
|
||||||
|
|
||||||
|
/* ac response */
|
||||||
|
diff(x);
|
||||||
|
solve(%, del(vout))/del(vin), factor;
|
||||||
|
ac : rhs(first(%));
|
||||||
|
|
||||||
|
dc_vin: 3.0;
|
||||||
|
dc_vout: float(gold), vin=dc_vin;
|
||||||
|
|
||||||
|
float(ac), vout=dc_vout, vin=dc_vin;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
* test resistor branch current, tran, no feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
R1 in N3 3 m = 4
|
||||||
|
Vm1 N3 N5 0
|
||||||
|
C1 N5 0 0.21
|
||||||
|
|
||||||
|
B1 out 0 V = i(R1)
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
* insertion of nodes and branches has to be checked for correct "unsetup"
|
||||||
|
* I saw a failing tran after an op, whilst tran alone worked
|
||||||
|
|
||||||
|
op
|
||||||
|
tran 1ms 1.0
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let R = 3 / 4
|
||||||
|
let C = 0.21
|
||||||
|
let tau = R * C
|
||||||
|
let omega = 2 * pi
|
||||||
|
let ot = omega * tau
|
||||||
|
let gold = (sin(time*omega)*ot + cos(time*omega) - exp(-time/tau)) * ot/(1+ot*ot)/R
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 4e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out) i(Vm1) * 0.99
|
||||||
|
plot v(out) gold * 0.99
|
||||||
|
plot v(out) - gold
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
* test resistor branch current, tran, with feedback
|
||||||
|
* (exec-spice "ngspice %s" t)
|
||||||
|
|
||||||
|
V1 in 0 SINE(0 1 1)
|
||||||
|
|
||||||
|
R1 in out 1
|
||||||
|
B1 out 0 v = i(R1)^3
|
||||||
|
|
||||||
|
.control
|
||||||
|
|
||||||
|
op
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
tran 1ms 1.0
|
||||||
|
rusage totiter
|
||||||
|
|
||||||
|
* syndrom
|
||||||
|
let x = v(in)^3 - 3*v(out)*v(in)^2 + 3*v(out)^2*v(in) - v(out)^3 - v(out)
|
||||||
|
|
||||||
|
let xx = v(out)^3 * 1.0 + v(out) - v(in)
|
||||||
|
|
||||||
|
* golden answer, derived with "maxima"
|
||||||
|
let P1 = sqrt(v(in)^2 + 4/27) - v(in)
|
||||||
|
let P2 = (P1 / 2) ^ (1/3)
|
||||||
|
let gold = P2 - 1 / (3*P2) + v(in)
|
||||||
|
|
||||||
|
let err = vecmax(abs(v(out) - gold))
|
||||||
|
echo "INFO: err =" $&err
|
||||||
|
|
||||||
|
if err > 20e-6
|
||||||
|
echo "ERROR: test failed"
|
||||||
|
quit 1
|
||||||
|
else
|
||||||
|
echo "INFO: success"
|
||||||
|
end
|
||||||
|
|
||||||
|
if 1
|
||||||
|
plot v(out)
|
||||||
|
plot v(out) - gold
|
||||||
|
plot x
|
||||||
|
else
|
||||||
|
quit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
.endc
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* vin ---R---+---- vout
|
||||||
|
* |
|
||||||
|
* u = i^3
|
||||||
|
* |
|
||||||
|
*/
|
||||||
|
|
||||||
|
g1: u = vin - R*i;
|
||||||
|
g2: u = i^3;
|
||||||
|
g3: vout = u;
|
||||||
|
|
||||||
|
x: eliminate([g1,g2,g3], [i,u]), R=1;
|
||||||
|
|
||||||
|
solve(x, vout);
|
||||||
|
third(%);
|
||||||
|
|
||||||
|
P1: sqrt(vin^2 + 4/27) - vin;
|
||||||
|
P2: (P1 / 2) ^ (1/3);
|
||||||
|
gold : P2 - 1 / (3*P2) + vin;
|
||||||
|
|
||||||
|
/* check by substitution into x, shall be zero */
|
||||||
|
x, vout=gold;
|
||||||
|
%, expand;
|
||||||
|
%, factor;
|
||||||
Loading…
Reference in New Issue