Software: FEM - Tutorial - Magnetfeld - Kennfeld-Nutzung zur System-Simulation: Unterschied zwischen den Versionen
Zeile 23: | Zeile 23: | ||
* Das den Kennfeld-Variablen vorangestellte Zeichen '''#''' muss entfernt werden (im Beispiel '''#i''' und '''#s''' durch '''i''' und '''s''' ersetzen). Ansonsten kommt es zu einem Syntax-Fehler im gcc-Compiler! | * Das den Kennfeld-Variablen vorangestellte Zeichen '''#''' muss entfernt werden (im Beispiel '''#i''' und '''#s''' durch '''i''' und '''s''' ersetzen). Ansonsten kommt es zu einem Syntax-Fehler im gcc-Compiler! | ||
* Der Datentyp '''float''' muss überall durch '''double''' ersetzt werden (Kompatibilitaetsforderung zu SimulationX). | * Der Datentyp '''float''' muss überall durch '''double''' ersetzt werden (Kompatibilitaetsforderung zu SimulationX). | ||
* Danach hat die Datei '''Magnet_RSM.c''' die folgende Form: | * Danach hat die Datei '''Magnet_RSM.c''' die folgende Form (gekürzt): | ||
double Covariance(double x1[],double x2[],double p[]) | |||
{ | |||
double Co, W; | |||
W = 0; | |||
for(int i = 0; i<2; i++) { | |||
W = W + (x1[i]-x2[i])*(x1[i]-x2[i])*p[i]*p[i]; | |||
} | |||
Co = exp(-W); | |||
return Co; | |||
} | |||
double F(double i, float s) | |||
{ | |||
double p[2]; | |||
double x1[2]; | |||
double x2[2]; | |||
double y = -46.7372056; | |||
y = y+10.5264863*pow(i,1); | |||
y = y+4.62081477*pow(s,1); | |||
p[0] = 0.161298213; | |||
p[1] = 0.928373134; | |||
x1[0] = i; | |||
x1[1] = s; | |||
x2[0] = 5.01; | |||
x2[1] = 2.02; | |||
y = y-183.986679*Covariance(x1,x2,p); | |||
x2[0] = 0.01; | |||
x2[1] = 0.02; | |||
y = y-8624.5598*Covariance(x1,x2,p); | |||
x2[0] = 2.01; | |||
x2[1] = 0.02; | |||
y = y+27677.7263*Covariance(x1,x2,p); | |||
: | |||
: | |||
x2[0] = 10.01; | |||
x2[1] = 4.02; | |||
y = y-1042.30105*Covariance(x1,x2,p); | |||
return y; | |||
} | |||
double Psi(double i, double s) | |||
{ | |||
double p[2]; | |||
double x1[2]; | |||
double x2[2]; | |||
double y = 0.0189621757; | |||
y = y+0.00649675907*pow(i,1); | |||
y = y-0.00349272992*pow(s,1); | |||
p[0] = 0.590637256; | |||
p[1] = 0.777378104; | |||
x1[0] = i; | |||
x1[1] = s; | |||
x2[0] = 5.01; | |||
x2[1] = 2.02; | |||
y = y-0.000721074847*Covariance(x1,x2,p); | |||
x2[0] = 0.01; | |||
x2[1] = 0.02; | |||
y = y-0.0269366063*Covariance(x1,x2,p); | |||
x2[0] = 2.01; | |||
x2[1] = 0.02; | |||
y = y+0.0298939078*Covariance(x1,x2,p); | |||
: | |||
: | |||
x2[0] = 10.01; | |||
x2[1] = 4.02; | |||
y = y-0.00522234634*Covariance(x1,x2,p); | |||
return y; | |||
} | |||
'''''===>>> Hier geht es bald weiter!!!''''' | '''''===>>> Hier geht es bald weiter!!!''''' |
Version vom 16. Oktober 2009, 12:10 Uhr
Verwendete Software
Es soll am Beispiel des Programms SimulationX gezeigt werden, wie der exportierte C-Code mit geringem Aufwand zur System-Simulation eines Magnet-Antriebs genutzt werden kann. Wir verwenden dazu den freien Gnu-C-Compiler gcc, der Bestandteil der GNU-Compiler Collection ist. Eine Portierung dieser Compiler Collection für Windows läuft unter Cygwin. Unter http://www.cygwin.com/ kann man eine aktuelle setup.exe für die Cygwin-Installation kostenlos herunterladen.
Ausführliche Hinweise zur Installation enthält die Installation_Cygwin.pdf von Herrn Sönke Hoffmann (Hochschule Ostwestfalen-Lippe). Von den darin angegebenen Komponenten der Development-Umgebung genügt für unsere Zwecke:
- gcc-core, der C- Compiler,
- make, ein Hilfsprogramm (dass man sicher benötigt)
Hinweis: Im Beispiel konnte bei der Benutzung der Download-Seite der TU-Dresden die Installation nicht vollendet werden, weil etwas fehlte. Ein Wechsel auf die Ruhr-Uni-Bochum führte zum Erfolg!
Die Windows-Systemvariable PATH wird, wie in der Anleitung beschrieben, durch den Verweis auf den cygwin\bin-Ordner erweitert. Damit ist gewährleistet, dass man den C-Compiler im Konsolen-Fenster von Windows direkt aufrufen kann.
Hinweis: Man muss in diesem Verzeichnis nachschauen, welche Version des Compilers installiert ist. In der Beispiel-Installation war es gcc-3.exe, deshalb ist dann der Compiler in der Konsole mit gcc-3 aufzurufen!
Erzeugen einer Windows-DLL
SimulationX bietet die Möglichkeit, externe Funktionen einzubinden, welche sich in einer Windwos-DLL befinden. Deshalb erzeugen wir aus dem vorliegenden c-Quelltext durch Compilieren mit dem gcc eine solche DLL-Datei:
- Der exportierte c-Quelltext der aktuellen OptiY-Version ist noch nicht vollständig kompatibel mit den Anforderungen des gcc und der Schnittstelle zum SimulationX. Das soll sich mit der nächsten OptiY-Version ändern. Bis dahin sind noch folgende Änderungen im Quelltext vorzunehmen:
- Das den Kennfeld-Variablen vorangestellte Zeichen # muss entfernt werden (im Beispiel #i und #s durch i und s ersetzen). Ansonsten kommt es zu einem Syntax-Fehler im gcc-Compiler!
- Der Datentyp float muss überall durch double ersetzt werden (Kompatibilitaetsforderung zu SimulationX).
- Danach hat die Datei Magnet_RSM.c die folgende Form (gekürzt):
double Covariance(double x1[],double x2[],double p[]) { double Co, W; W = 0; for(int i = 0; i<2; i++) { W = W + (x1[i]-x2[i])*(x1[i]-x2[i])*p[i]*p[i]; } Co = exp(-W); return Co; }
double F(double i, float s) { double p[2]; double x1[2]; double x2[2]; double y = -46.7372056; y = y+10.5264863*pow(i,1); y = y+4.62081477*pow(s,1); p[0] = 0.161298213; p[1] = 0.928373134; x1[0] = i; x1[1] = s; x2[0] = 5.01; x2[1] = 2.02; y = y-183.986679*Covariance(x1,x2,p); x2[0] = 0.01; x2[1] = 0.02; y = y-8624.5598*Covariance(x1,x2,p); x2[0] = 2.01; x2[1] = 0.02; y = y+27677.7263*Covariance(x1,x2,p); : : x2[0] = 10.01; x2[1] = 4.02; y = y-1042.30105*Covariance(x1,x2,p); return y; }
double Psi(double i, double s) { double p[2]; double x1[2]; double x2[2]; double y = 0.0189621757; y = y+0.00649675907*pow(i,1); y = y-0.00349272992*pow(s,1); p[0] = 0.590637256; p[1] = 0.777378104; x1[0] = i; x1[1] = s; x2[0] = 5.01; x2[1] = 2.02; y = y-0.000721074847*Covariance(x1,x2,p); x2[0] = 0.01; x2[1] = 0.02; y = y-0.0269366063*Covariance(x1,x2,p); x2[0] = 2.01; x2[1] = 0.02; y = y+0.0298939078*Covariance(x1,x2,p); : : x2[0] = 10.01; x2[1] = 4.02; y = y-0.00522234634*Covariance(x1,x2,p); return y; }
===>>> Hier geht es bald weiter!!!