Das Skript ist per Menü (s.u.) gesteuert.
Es errechnet den Gesamtwert von parallel geschalteten Widerständen.
Das Skript soll Angebote zu einem gewünschten Zielwert machen.
Die nachfolgende Skript-Version ist etwa 2,5-fach schneller als die am Ende
und verwendet die neueste bish V6.22 (typeset).
#!/u/bin/bish set -f ARITH_FMT='%.9Lg' # r= (10^(1/24))^n ; n=0..23.. E6='1.0 1.5 2.2 3.3 4.7 6.8' E12='1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2' E24='1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0 3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1' E48='1.00 1.05 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.69 1.78 1.87 1.96 2.05 2.15 2.26 2.37 2.49 2.61 2.74 2.87 3.01 3.16 3.32 3.48 3.65 3.83 4.02 4.22 4.42 4.64 4.87 5.11 5.36 5.62 5.90 6.19 6.49 6.81 7.15 7.50 7.87 8.25 8.66 9.09 9.53' E96='1.00 1.02 1.05 1.07 1.10 1.13 1.15 1.18 1.21 1.24 1.27 1.30 1.33 1.37 1.40 1.43 1.47 1.50 1.54 1.58 1.62 1.65 1.69 1.74 1.78 1.82 1.87 1.91 1.96 2.00 2.05 2.10 2.15 2.21 2.26 2.32 2.37 2.43 2.49 2.55 2.61 2.67 2.74 2.80 2.87 2.94 3.01 3.09 3.16 3.24 3.32 3.40 3.48 3.57 3.65 3.74 3.83 3.92 4.02 4.12 4.22 4.32 4.42 4.53 4.64 4.75 4.87 4.99 5.11 5.23 5.36 5.49 5.62 5.76 5.90 6.04 6.19 6.34 6.49 6.65 6.81 6.98 7.15 7.32 7.50 7.68 7.87 8.06 8.25 8.45 8.66 8.87 9.09 9.31 9.53 9.76' E=24 Tol=0.3 Zeilen=12 Beg=10.0 End=1e6 Del='1e6 ' Err() { print -u2 "$1"; exit 1; } k='${#E'"$E"'}' eval k=$k [ -z "$k" -o k -lt 11 ] && Err "Falsche E-Reihe: E$E" FillBuf() { local er=... r=.... r0=0000 f=0 lg:025 sf:025 local c:08 o:08 n:08 fak:025 local sz=$(typeset -F) typeset -f a zero let "Beg<1.0" && Err "Startwert<1: $Beg" let "Beg>=End" && Err "Startwert>=Endwert: $Beg $End" [ E -eq $1 ] && return 0 [ $1 -gt 0 ] && E=$1 er=E$E : ${{er}} ; n=$, [ n -ne E ] && Err "Falsche Anzahl Werte $er: $n" let "fak=pow(10.0,1.0/E), r0=1.0/fak" for r in ${{er}} do let "r<1.0" && Err "$er-Wert < 1: $r" let "r>a" || Err "$er-Wert nicht streng monoton steigend: $r" let "r/r0>fak*1.05||r/r0<fak/1.05" && Err "$er-Wert-Faktor vom Vorwert her unpassend: $r/$r0" a=$r r0=$r [ f -eq 1 ] && continue let "lg=log10(End/r)" "lg-trunc(lg)>0.0" && continue f=1 done [ f -ne 1 ] && Err "Endwert unpassend: $End" f=0 for r in ${{er}} do let "r<1.0" && Err "$er-Wert < 1: $r" [ f -eq 1 ] && continue let "lg=log10(Beg/r)" "lg-trunc(lg)>0.0" && continue let "sf=Beg/r" f=1 echo Startwert-Faktor: $sf done [ f -ne 1 ] && Err "Startwert unpassend: $Beg" set BUF:32.$(( llround(ceil(log10(End/Beg))*E*sz+E*sz) )) n=${#BUF} echo "Puffergroesse: $n" echo "Puffergroesse: $((n/sz)) Einträge" f=0 o=0 while : do for r in ${{er}} do let "a=sf*r" if [ f -eq 1 ] then catv a =o,sz,BUF else let "a!=Beg" && continue f=1 catv a =o,sz,BUF fi let "o+=sz" "a==End" || continue let "n=o/sz" break 2 done let "sf*=10" done N=$n echo "Einträge: $n" Del=$Del [ -z "$Del" ] && return 0 c=0 for o from 0 by $sz to $((n*sz-sz)) repeat do catv o,sz,BUF =a for r in $Del do let "a!=r" && continue catv zero =o,sz,BUF let "++c" done done echo "Pufferwerte gelöscht: $c" set BUFC:32.${#BUF} catv BUF =BUFC c=0 for o from 0 by $sz to $((n*sz-sz)) repeat do catv o,sz,BUFC =a let "a<1.0" && continue catv a =c,sz,BUF ; let "c+=sz" done let "N=c/sz" echo "Einträge: $N" return 0 } FillBuf -1 GetRpar() { local o:08 oa:08 ob:08 oc:08 m:025 t:08 f=0 local sz=$(typeset -F) typeset -f a b c v zp zm ziel=$1 let "t=N*sz-sz" let "zp=ziel*(1.0+Tol/100.0)" "zm=ziel*(1.0-Tol/100.0)" for o from 0 by $sz to $t repeat do catv o,sz,BUF =v let "v>=ziel" && { f=1; break; } done [ f -ne 1 ] && return 1 for oa from $o by $sz to $t repeat do catv oa,sz,BUF =v if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t1 $m # $ziel : $v = $v" fi done for oa from $o by $sz to $t repeat do catv oa,sz,BUF =a for ob from $o by $sz to $t repeat do catv ob,sz,BUF =b let "a==ziel||b==ziel" && break 2 let "a>b" && continue let "v=rpar2(a,b)" if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t2 $m # $ziel : $v = $a|$b" fi done done for oa from $o by $sz to $t repeat do catv oa,sz,BUF =a for ob from $o by $sz to $t repeat do catv ob,sz,BUF =b let "a>b" && continue for oc from $o by $sz to $t repeat do catv oc,sz,BUF =c let "a==ziel||b==ziel||c==ziel" && break 3 let "a>c||b>c" && continue let "v=rpar3(a,b,c)" if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t3 $m # $ziel : $v = $a|$b|$c" fi done done done return 0 } Results() { local zln=$Zeilen ap0=0 ap=0 local ppm:010 ziel:025 val:025 pr:.40 GetRpar "$1" | sortl -fn1,n2 | { while read ap ppm - ziel - val - pr do [ ap -ne ap0 ] && { ap0=$ap zln=$Zeilen; echo; } [ zln -eq 0 ] && continue expr "$pr" :pr '%.0%([^0-9]%)' + '%1' expr "$pr" :pr '%.0$' = '' expr "$pr" :pr '|' += ' | ' prints s12bsbs9bsbs-12bsbs $ppm : $ziel : $val = "$pr" let "--zln" done } return 0 } local z=000 e=000 t=000000 prints vs-2 z $Zeilen prints vs-2 e $E prints vs-4 t $Tol while echo " %tStartwert=$Beg Endwert=$End %tReihe=E$e : e# (e6 e12 e24 e48 e96) %tZeilen=$z : z # %tToleranz=$t: t # %tZielwert : zahl (123 12.3 12e3 ...) %tBeenden : E %t : _%b%c" do read cmd arg case "$cmd" in e6) FillBuf 6;; e12) FillBuf 12;; e24) FillBuf 24;; e48) FillBuf 48;; e96) FillBuf 96;; z) expr "$arg" :: '[1-9][0-9]*' || { echo '%a%c'; continue; } Zeilen=$arg;; t) expr "$arg" :: '[0-9][0-9.]*' || { echo '%a%c'; continue; } Tol=$arg;; [0-9]*) Results "$cmd";; E) break;; *) echo '%a%c'; continue;; esac prints vs-2 z $Zeilen prints vs-2 e $E prints vs-4 t $Tol done :
#!/u/bin/bish set -f ARITH_FMT='%.9Lg' # r= (10^(1/24))^n ; n=0..23.. E6='1.0 1.5 2.2 3.3 4.7 6.8' E12='1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2' E24='1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0 3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1' E48='1.00 1.05 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.69 1.78 1.87 1.96 2.05 2.15 2.26 2.37 2.49 2.61 2.74 2.87 3.01 3.16 3.32 3.48 3.65 3.83 4.02 4.22 4.42 4.64 4.87 5.11 5.36 5.62 5.90 6.19 6.49 6.81 7.15 7.50 7.87 8.25 8.66 9.09 9.53' E=24 Tol=0.3 Zeilen=12 Beg=10.0 End=1e6 Del='1e6 ' Err() { print -u2 "$1"; exit 1; } e='${#E'"$E"'}' eval e=$e [ -z "$e" -o e -lt 11 ] && Err "Falsche E-Reihe: E$E" FillBuf() { local er=... r=.... r0=0000 f=0 lg:025 sf:025 a:025 local lz:32.20 c:08 o:08 n:08 fak:025 let "Beg<1.0" && Err "Startwert<1: $Beg" let "Beg>=End" && Err "Startwert>=Endwert: $Beg $End" [ E -eq $1 ] && return 0 [ $1 -gt 0 ] && E=$1 er=E$E : ${{er}} ; a=$, [ a -ne E ] && Err "Falsche Anzahl Werte $er: $a" a=0.0 let "fak=pow(10.0,1.0/E), r0=1.0/fak" for r in ${{er}} do let "r<1.0" && Err "$er-Wert < 1: $r" let "r>a" || Err "$er-Wert nicht streng monoton steigend: $r" let "r/r0>fak*1.05||r/r0<fak/1.05" && Err "$er-Wert-Faktor vom Vorwert her unpassend: $r/$r0" a=$r r0=$r [ f -eq 1 ] && continue let "lg=log10(End/r)" "lg-trunc(lg)>0.0" && continue f=1 done [ f -ne 1 ] && Err "Endwert unpassend: $End" f=0 for r in ${{er}} do let "r<1.0" && Err "$er-Wert < 1: $r" [ f -eq 1 ] && continue let "lg=log10(Beg/r)" "lg-trunc(lg)>0.0" && continue let "sf=Beg/r" f=1 echo Startwert-Faktor: $sf done [ f -ne 1 ] && Err "Startwert unpassend: $Beg" set BUF:32.$(( llround(ceil(log10(End/Beg))*E*20+E*20) )) a=${#BUF} echo "Puffergroesse: $a" echo "Puffergroesse: $((a/20)) Einträge" f=0 o=0 while : do for r in ${{er}} do let "a=sf*r" if [ f -eq 1 ] then catv a =o,20,BUF else let "a!=Beg" && continue f=1 catv a =o,20,BUF fi let "o+=20" "a==End" || continue let "n=o/20" break 2 done let "sf*=10" done N=$n echo "Einträge: $n" Del=$Del [ -z "$Del" ] && return 0 c=0 for o from 0 by 20 to $((n*20-20)) repeat do catv o,20,BUF =a: a=$a for r in $Del do let "a!=r" && continue catv lz =o,20,BUF let "++c" done done echo "Pufferwerte gelöscht: $c" set BUFC:32.${#BUF} catv BUF =BUFC c=0 for o from 0 by 20 to $((n*20-20)) repeat do catv o,20,BUFC =a: catv 1,a =f: [ "$f" = ' ' ] && continue catv a =c,20,BUF ; let "c+=20" done let "N=c/20" echo "Einträge: $N" return 0 } FillBuf -1 GetRpar() { local o:08 oa:08 ob:08 oc:08 a:025 b:025 c:025 local ziel=$1 v:025 m:025 zp:025 zm:025 t:08 f=0 let "t=N*20-20" let "zp=ziel*(1.0+Tol/100.0)" "zm=ziel*(1.0-Tol/100.0)" for o from 0 by 20 to $t repeat do catv o,20,BUF =v: ; v=$v let "v>=ziel" && { f=1; break; } done [ f -ne 1 ] && return 1 for oa from $o by 20 to $t repeat do catv oa,20,BUF =a: ; v=$a if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t1 $m # $ziel : $v = $v" fi done for oa from $o by 20 to $t repeat do catv oa,20,BUF =a: ; a=$a for ob from $o by 20 to $t repeat do catv ob,20,BUF =b: ; b=$b let "a==ziel||b==ziel" && break 2 let "a>b" && continue let "v=rpar2(a,b)" if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t2 $m # $ziel : $v = $a|$b" fi done done for oa from $o by 20 to $t repeat do catv oa,20,BUF =a: ; a=$a for ob from $o by 20 to $t repeat do catv ob,20,BUF =b: ; b=$b let "a>b" && continue for oc from $o by 20 to $t repeat do catv oc,20,BUF =c: ; c=$c let "a==ziel||b==ziel||c==ziel" && break 3 let "a>c||b>c" && continue let "v=rpar3(a,b,c)" if let "v<=zp&&v>=zm" then let "m=fabs(v/ziel-1.0), m=llround(m*1e6)" echo "%t3 $m # $ziel : $v = $a|$b|$c" fi done done done return 0 } Results() { local zln=$Zeilen ap0=0 ap=0 local ppm:010 ziel:025 val:025 pr:.40 GetRpar "$1" | sortl -fn1,n2 | { while read ap ppm - ziel - val - pr do [ ap -ne ap0 ] && { ap0=$ap zln=$Zeilen; echo; } [ zln -eq 0 ] && continue expr "$pr" :pr '%.0%([^0-9]%)' + '%1' expr "$pr" :pr '%.0$' = '' expr "$pr" :pr '|' += ' | ' prints s12bsbs9bsbs-12bsbs $ppm : $ziel : $val = "$pr" let "--zln" done } return 0 } while echo " %tStartwert=$Beg Endwert=$End %tReihe=E$E Zielwert-Toleranz=$Tol%% %tWahl E6 : e6 %tWahl E12 : e12 %tWahl E24 : e24 %tWahl E48 : e48 %tZeilen max: z # [$Zeilen] %tToleranz : t # (t 0.5) %tZielwert : zahl (123 12.3 12e3 ...) %tBeenden : E %t : _%b%c" do read cmd arg case "$cmd" in e6) FillBuf 6;; e12) FillBuf 12;; e24) FillBuf 24;; e48) FillBuf 48;; z) expr "$arg" :: '[1-9][0-9]*' || { echo '%a%c'; continue; } Zeilen=$arg;; t) expr "$arg" :: '[0-9][0-9.]*' || { echo '%a%c'; continue; } Tol=$arg;; [0-9]*) Results "$cmd";; E) break;; *) echo '%a%c'; continue;; esac done :