#include <stdio.h>
#include <math.h>

main()
{
    int   n, niter, i, jj;
    float pai, delta, e, fe, j;
    float s[32], ss[32], r[32], t[32], fw[32];
    float gntn(float fw[32], float s[32]);

    n=32;
    pai=3.1415926535;
    niter=20;
    delta=0.000001;
    e=0;

    for(i=0;i<n;i++)
    {
        j=(float)i;
        s[i]=sin((j/16.0)*pai)+0.9;
        ss[i]=1.0;
        e=e+pow(s[i]-ss[i],2);
    }
    printf("ITER = 0 , ERROR = %f\n",e);
    for(i=1;i<=niter;i++)
    {
        for(jj=0;jj<n;jj++) fw[jj]=ss[jj];
        for(jj=0;jj<n;jj++)
        {
            fw[jj]=fw[jj]+delta;
            fe=gntn(fw,s);
            r[jj]=(fe-e)/delta;
            fw[jj]=ss[jj];
            if ((ss[jj]<0.00001) && (r[jj]>0.0))
                t[jj]=0.0;
            else
                t[jj]=1.0;
        }
        for(jj=0;jj<n;jj++)
        {
            ss[jj]=ss[jj]-t[jj]*r[jj]/2.0;
            if (ss[jj]<0.0) ss[jj]=0.0;
            fw[jj]=ss[jj];
        }
        fe=gntn(fw,s);
        e=fe;
        printf("ITER = %d , ERROR = %f\n",i,e);
    }
}

float gntn(float fw[32], float s[32])
{
    int   jf, n;
    float fe;

    n=32;
    fe=0.0;

    for(jf=0;jf<n;jf++) fe=fe+pow(fw[jf]-s[jf],2);
    return(fe);
}

