3 Scilab | |
→ | 3.16 Beispiele |
Dieses Beispiel zeigt die Spline-Interpolation.
Aufgabenstellung |
B-Wert für gegebenes H finden |
H-Wert für vorgegebenes B finden |
Optimalen Arbeitspunkt finden |
Plot |
Gegeben ist die B-H-Kennlinie eines permanentmagnetischen Materials in Form von Messdaten, siehe Tabelle:
H / Acm-1 | B / T |
---|---|
-525 | 0 |
-470 | 0,5 |
-420 | 0,72 |
-330 | 0,94 |
-220 | 1,12 |
-120 | 1,22 |
0 | 1,30 |
Folgende Größen sollen ermittelt werden:
Mit der Scilab-Datei
// Vektor mit den H-Werten
h = [ -525 -470 -420 -330 -220 -120 0 ]';
// Vektor mit den B-Werten
b = [ 0 0.50 0.72 0.94 1.12 1.22 1.30 ]';
// Ergebnis von splin
d = splin(h, b);
function [y] = Bfct(x)
y = interp(x, h, b, d);
endfunction
// Problem 1: Suche nach B, wenn H=-250 Ampere pro Zentimeter
printf('B1 = %g\n', Bfct(-250));
finden wir die Lösung B1=1,078 T.
Die Funktion Bfct berechnet B für einen gegebenen H-Wert. Dazu werden die vorher angelegten Vektoren h, b und d benutzt.
Gesucht wird die Nullstelle von f(H)=B(H)-0,8 T.
// Vektor mit den H-Werten
h = [ -525 -470 -420 -330 -220 -120 0 ]';
// Vektor mit den B-Werten
b = [ 0 0.50 0.72 0.94 1.12 1.22 1.30 ]';
// Ergebnis von splin
d = splin(h, b);
function [y] = Bfct(x)
y = interp(x, h, b, d);
endfunction
function [y] = Bsoll(x)
y = Bfct(x) - 0.8;
endfunction
function [y] = Bd1(x)
[a, y] = interp(x, h, b, d);
endfunction
// Problem 2: Suche nach H für vorgegebenes B=0.8 Tesla
[H2, diff, info] = fsolve(-250, Bsoll, Bd1);
if 1==info then
printf('H2 = %g\n', H2);
else
printf('Leider keine Loesung gefunden!\n');
end
Die Funktion Bsoll implementiert die Funktion, deren
Nullstelle wir suchen. Die Funktion Bd1 implementiert die
erste Ableitung und nutzt dafür die von interp() gelieferte
Ableitung.
Für die Nullstellensuche wird fsolve() benutzt.
Die Funktion f1(H) liefert das Produkt B*H. Am Extremwert dieser Funktion ist die erste Ableitung 0. Um die Nullstelle der ersten Ableitung zu suchen, wollen wir Scilab auch deren erste Ableitung (also die zweite Ableitung der Originalfunktion) zur Verfügung stellen.
// Vektor mit den H-Werten
h = [ -525 -470 -420 -330 -220 -120 0 ]';
// Vektor mit den B-Werten
b = [ 0 0.50 0.72 0.94 1.12 1.22 1.30 ]';
// Ergebnis von splin
d = splin(h, b);
// Berechnung von B*H.
function [y] = f1(x)
y = x * interp(x, h, b, d);
endfunction
// Erste Ableitung von B*H nach H,
// Nullstelle dieser Funktion wird gesucht, um
// Maximum von B*H zu finden.
function [y] = f1d1(x)
[r, r1] = interp(x, h, b, d);
y = x * r1 + r;
endfunction
// Zweite Ableitung von B*H nach H,
// Ableitung der Funktion, deren Nullstelle wir suchen.
function [y] = f1d2(x)
[r, r1, r2] = interp(x, h, b, d);
y = x * r2 + 2 * r1;
endfunction
// Problem 3: Suche nach Maximum fuer B*H
[H3, diff, info] = fsolve(-250, f1d1, f1d2);
if 1==info then
printf('H3 = %g\nB3 = %g\nBH = %g\n', H3, interp(H3, h, b, d), f1(H3));
else
printf('Leider keine Loesung fuer Problem 3 gefunden!\n');
end
Im Quelltext implementiert die Funktion f1 die Funktion zur Produktbildung, f1d1 und f1d2 implementieren die erste und zweite Ableitung. Mit fsolve() wird nach der Nullstelle der ersten Ableitung gesucht, zur Unterstützung wird die Funktion für die zweite Ableitung mit angegeben. In f1d1 und f1d2 werden die Rückgabewerte ypabl1 und ypabl2 verwendet, die die erste bzw. zweite Ableitung von B nach H enthalten.
// Vektor mit den H-Werten
h = [ -525 -470 -420 -330 -220 -120 0 ]';
// Vektor mit den B-Werten
b = [ 0 0.50 0.72 0.94 1.12 1.22 1.30 ]';
// Ergebnis von splin
d = splin(h, b);
function [y] = Bfct(x)
y = interp(x, h, b, d);
endfunction
// Problem 1: Suche nach B, wenn H=-250 Ampere pro Zentimeter
printf('B1 = %g\n', Bfct(-250));
htest = linspace(-525,0,2001)';
btest = Bfct(htest);
plot2d(htest, btest, strf='061');
Um den Plot für |BH| zu erhalten, wird die plot2d()-Anweisung ersetzt durch:
bhtest = abs(htest .* btest); plot2d(htest, bhtest, strf='061');