Numerical Algorithms Group - NAG
Bei dem Programm handelt es sich um eine Sammlung von numerischen Algorithmen, beispielsweise zur Berechnung von Nullstellen eines Polynoms, dem Lösen linearer Gleichungssysteme und dem Berechnen interpolierender Splines. Die zur Verfügung stehenden Algorithmen können in FORTRAN und in C genutzt werden. Auf der NAG-Herstellerseite können Sie der ausführlichen Numerical Algorithmus Group- Documentation Informationen zur genauen Umsetzung entnehmen. Sowohl der Einsatz unter C als auch der Einsatz unter FORTRAN wird sehr gut beschrieben. Das RRZK bietet NAG auf Cheops an. Zur Verwendung wird das Modul nag geladen:Für Verwendung in FORTRAN: module load nag
Paralleles Rechnen mit NAG
Mit NAG ist auch parallele Programmierung möglich, sodass die Ressourcen auf Cheops optimal genutzt werden können. Weitere Informationen können Sie der Dokumentation der NAG Parallel Library entnehmen.Beispiel zur Verwendung
Als kleines Beispiel wollen wir einmal die Nullstellen des Polynoms 3.5 x3 - 4.0 x2 + 2.7 x + 1.0 berechnen lassen. Der folgende Quelltext in C würde dieses Problem lösen:// Finde die Nullstellen eines Polynoms
#include <nag.h>
#include <nagx04.h>
#include <stdio.h>
#include <math.h>
#include <nag_stdlib.h>
#include <nagc02.h>
int main()
{
Integer n, i;
int exit_status = 0;
double *a;
Complex *z = 0;
NagError fail;
Nag_Boolean scale;
scale = Nag_TRUE;
printf("========================================================\n");
printf("Programm, um Nullstellen eines Polynoms zu finden\n");
printf("========================================================\n\n");
INIT_FAIL(fail);
printf("Grad des Polynoms: n = ");
scanf("%ld", &n);
if (!(0 < n && n <= 5))
{
printf("Bitte waehlen Sie einen Grad 0 < n <= 5!\n");
exit_status = 1;
goto END;
}
if (!(a = NAG_ALLOC(n+1, double)) || !(z = NAG_ALLOC(n, Complex)))
{
printf("Allocation-Fehler\n");
exit_status = 1;
goto END;
}
printf("Form des Polynoms: ");
for (i=n; i > 0; i--)
{
printf("a[%d] * x^%d + ", n-i, i);
}
printf("a[%d], \ta[i] reell", n);
printf("\n\nDateneingabe:\n");
for (i=0; i <= n; i++)
{
printf("a[%d] = ", i);
scanf("%lf", &a[i]);
}
nag_zeros_real_poly(n, a, scale, z, &fail);
if (fail.code != NE_NOERROR)
{
printf("Fehler: %s\n", fail.message);
exit_status = 1;
goto END;
}
for (i=0;i<n;i++)
{
printf("Nullstelle %2d: %3.3lf + i %3.3lf\n", i+1, z[i].re, z[i].im);
}
END:
if (a) NAG_FREE(a);
if (z) NAG_FREE(z);
printf("Programm wird beendet mit Status %d.\n", exit_status);
return exit_status;
}
========================================================
Programm, um Nullstellen eines Polynoms zu finden
========================================================
Grad des Polynoms: n = 3
Form des Polynoms: a[0] * x^3 + a[1] * x^2 + a[2] * x^1 + a[3], a[i] reell
Dateneingabe:
a[0] = 3.5
a[1] = -4.0
a[2] = 2.7
a[3] = 1.0
Nullstelle 1: 0.698 + i 0.799
Nullstelle 2: 0.698 + i -0.799
Nullstelle 3: -0.254 + i 0.000
Programm wird beendet mit Status 0.