Listing des Programms HYPSI-PI.C
/* Programm hypsi-pi.c */
/* 3-Schicht-Hyperbolisches-Sigma-Pi-Interpolationsnetz */
/* fuer Standardbeispiel */
/* Burkhard Lenze */
/* 13.02.2009 */
/* header-files */
#include <stdio.h>
#include <math.h>
#include "hypsi-pi.h"
/* globale Variablen */
float x[5][30]; /* Eingabevektorfeld */
float y[5][30][30]; /* Ausgabevektorfeld */
float rho[30][30]; /* Skalierungsfaktoren */
float d1[30][30]; /* Matrixfeld der Differenzgewichte */
float d2[30][30]; /* Matrixfeld der Differenzgewichte */
float g[30][30]; /* Matrixfeld der Ausgangsgewichte */
float x_test[5]; /* Aktueller Testeingang */
float y_test[5]; /* Aktueller Testausgang */
int Pxy; /* Anzahl der x-y-Abtastpunkte */
int n=2; /* Anzahl der Eingabe-Neuronen */
int q; /* Anzahl der verborgenen Neuronen */
int m=1; /* Anzahl der Ausgabe-Neuronen */
char com; /* Menuparameter */
/* Funktionen */
void lese_x_test(void)
{
int i;
printf("\n");
for (i=1;i<=n;i++)
{
printf("x[%1d] = ? ",i);
scanf("%f",&x_test[i]);
}
}
float f(float x1, float x2)
{
float Z;
Z=1.0;
if (x1+x2>=1.5) {Z=0.0;}
if ((x1<=0.5)&&(x2<=0.25)) {Z=0.0;}
if ((x1<-0.0001)||(x1>1.0001)) {Z=0.0;}
if ((x2<-0.0001)||(x2>1.0001)) {Z=0.0;}
return(Z);
}
void lese_x_y(void)
{
int k,l;
for (k=0;k<=Pxy+1;k++)
{
x[1][k]=(k-1.0)/(Pxy-1.0);
}
for (l=0;l<=Pxy+1;l++)
{
x[2][l]=(l-1.0)/(Pxy-1.0);
}
for (l=0;l<=Pxy+1;l++)
{
for (k=0;k<=Pxy+1;k++)
{
y[1][k][l]=f(((k-1.0)/(Pxy-1.0)),((l-1.0)/(Pxy-1.0)));
}
}
}
float T(float A)
{
if (A>-0.00001) return(1.0);
else return(0.0);
}
void lernen(void)
{
int j,kk,ll,k,l;
float H,err,y_[5];
lese_x_y();
for (l=0;l<=Pxy;l++)
{
for (k=0;k<=Pxy;k++)
{
rho[k][l]=(Pxy-1.0)*(Pxy-1.0);
d1[k][l]=(k-0.5)/(Pxy-1.0);
d2[k][l]=(l-0.5)/(Pxy-1.0);
g[k][l]=0.5*(y[1][k][l]-y[1][k+1][l]-y[1][k][l+1]+y[1][k+1][l+1]);
}
}
err=0.0;
for (ll=1;ll<=Pxy;ll++)
{
for (kk=1;kk<=Pxy;kk++)
{
for (j=1;j<=m;j++)
{
y_[j]=0.0;
for (l=0;l<=Pxy;l++)
{
for (k=0;k<=Pxy;k++)
{
H=rho[k][l]*(x[1][kk]-d1[k][l]);
H=H*(x[2][ll]-d2[k][l]);
y_[j]=y_[j]+g[k][l]*T(H);
}
}
err=err+(y[j][kk][ll]-y_[j])*(y[j][kk][ll]-y_[j]);
}
}
}
printf("\nDer Fehler lautet wie erwartet: %f .",err);
printf("\n");
}
void ausfuehren(void)
{
int j,k,l;
float H;
lese_x_test();
for (j=1;j<=m;j++)
{
y_test[j]=0.0;
for (l=0;l<=Pxy;l++)
{
for (k=0;k<=Pxy;k++)
{
H=rho[k][l]*(x_test[1]-d1[k][l]);
H=H*(x_test[2]-d2[k][l]);
y_test[j]=y_test[j]+g[k][l]*T(H);
}
}
}
printf("\n");
for (j=1;j<=m;j++) {printf("y[%1d] = %8.4f\n",j,y_test[j]);}
}
void veraendern(void)
{
printf("\n");
printf("Anzahl Pxy der x-y-Abtastpunkte ? ");
scanf("%d",&Pxy);
q=(Pxy+1)*(Pxy+1);
printf("\nEs ist also n = %4d . ",n);
printf("\nEs ist also q = %4d . ",q);
printf("\nEs ist also m = %4d . ",m);
printf("\n");
}
/* Hauptprogramm */
int main(void)
{
veraendern();
do
{
printf("\nlernen ausfuehren veraendern beenden:\n");
fflush(stdin);
scanf("%c",&com);
switch(com)
{
case 'l': lernen(); break;
case 'a': ausfuehren(); break;
case 'v': veraendern(); break;
default: break;
}
}
while (com!='b');
return(0);
}
Burkhard Lenze
Im Februar 2009