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