Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Zwracanie tablicy z funkcji

Ostatnio zmodyfikowano 2014-12-11 12:32
Autor Wiadomość
adiagioo
Temat założony przez niniejszego użytkownika
[C] Zwracanie tablicy z funkcji
» 2014-12-11 11:45:03
Witam,
program jest implementacją metody Hooke'a Jevles'a z dziedziny optymalizacji (a przynajmniej powinien być). Generalnie program mi się zapętla choć wydaje mi się, że wszelkie założenia są dobrze zrobione. Z maina wywołuje funkcję(probny), która coś tam oblicza i kiedy to konieczne wykorzystuje inną funkcję(roboczy). Natomiast nie jestem pewien czy wywołania funkcji i zwracanie tablic z tych funkcji są poprawne. Gdzie jest błąd?

KOD:
C/C++
#include <stdio.h>
#include <stdlib.h>


/**
*
* @author Adam
*/

/**
     * @param args the command line arguments
     */
double f( double x, double y )
{
    return 2.5 *( x * x - y ) *( x * x - y ) +( 1 - x ) *( 1 - x );
}



double * roboczy( double x[], double xb[], double xb0[] )
{
    xb0[ 0 ] = xb[ 0 ];
    xb[ 0 ] = x[ 0 ];
    x[ 0 ] = 2 * xb[ 0 ] - xb0[ 0 ];
    //System.out.println("xb[0]"+xb[0]);
    xb0[ 1 ] = xb[ 1 ];
    xb[ 1 ] = x[ 1 ];
    x[ 1 ] = 2 * xb[ 1 ] - xb0[ 1 ];
   
    printf( "xr= %f yr= %f\n", x[ 0 ], x[ 1 ] );
    printf( "f(xr,yr)= %f \n", f( x[ 0 ], x[ 1 ] ) );
    //fflush(stdin);
    return x;
}


double * probny( double x[], double xp[], double xb[], double xb0[], double * s )
{
    double e = 0.01;
    double alfa = 0.5;
    do
    {
        xp[ 0 ] = x[ 0 ];
        xp[ 1 ] = x[ 1 ];
        if( f( x[ 0 ] +( * s ), x[ 1 ] ) < f( x[ 0 ], x[ 1 ] ) )
        {
           
            x[ 0 ] = x[ 0 ] +( * s );
            printf( "x= %f\n", x[ 0 ] );
        }
        else if( f( x[ 0 ] -( * s ), x[ 1 ] ) < f( x[ 0 ], x[ 1 ] ) )
        {
           
            x[ 0 ] = x[ 0 ] -( * s );
            printf( "x= %f\n", x[ 0 ] );
        }
        if( f( x[ 0 ], x[ 1 ] +( * s ) ) < f( x[ 0 ], x[ 1 ] ) )
        {
           
            x[ 1 ] = x[ 1 ] +( * s );
            printf( "y= %f\n", x[ 1 ] );
        }
        else if( f( x[ 0 ], x[ 1 ] -( * s ) ) < f( x[ 0 ], x[ 1 ] ) )
        {
           
            x[ 1 ] = x[ 1 ] -( * s );
            printf( "y= %f\n", x[ 1 ] );
        }
        if( xp[ 0 ] != x[ 0 ] || xp[ 1 ] != x[ 1 ] )
        {
            x = roboczy( x, xb, xb0 );
            //printf("rob = %f\n",f(x[0],x[1]));
           
        }
        else
        {
            if( f( x[ 0 ], x[ 1 ] ) <= f( xb[ 0 ], xb[ 1 ] ) )
            {
                ( * s ) = alfa /( 1 /( * s ) );
                printf( "s= %f\n",( * s ) );
            }
            else
            {
                x = roboczy( x, xb, xb0 );
               
            }
           
        }
        printf( "xp= %f yp= %f\n", x[ 0 ], x[ 1 ] );
        printf( "f(xp,yp) = %f\n", f( x[ 0 ], x[ 1 ] ) );
    } while( * s > e );
   
    return x;
}


int main()
{
   
    double xb[ 2 ];
    double xb0[ 2 ];
    int i = 0;
    double * tab;
    double xp[ 2 ];
    double x[] = { - 0.5, 1 };
    double s = 0.5;
   
    printf( "f= %f\n", f( x[ 0 ], x[ 1 ] ) );
    xb0[ 0 ] = x[ 0 ];
    xb0[ 1 ] = x[ 1 ];
   
    xp[ 0 ] = x[ 0 ];
    xp[ 1 ] = x[ 1 ];
   
    xb[ 0 ] = x[ 0 ];
    xb[ 1 ] = x[ 1 ];
    printf( "%f %f\n", xb[ 0 ], xb[ 1 ] );
    //wywolanie funkcji
    tab = probny( x, xp, xb, xb0, & s );
    printf( "x=%f y=%f\n", x[ 0 ], x[ 1 ] );
   
    return 0;
}
P-122676
pekfos
» 2014-12-11 12:19:36
Po co w ogóle chcesz zwracać tablicę? Zwracasz adres tablicy przekazanej jako argument - i tak wszystkie operacje w funkcji wykonujesz na oryginalnej tablicy.
P-122677
darko202
» 2014-12-11 12:32:59
1.
zastanawiam się nad konstrukcją
C/C++
double * probny( double x[],...) {
    ..
    return x;
}

o ile pamiętam przekazując tablicę do funkcji/procedury
zawsze przekazujesz wskaźnik do tej tablicy
w środku tych bloków co byś robił to nie działasz na kopii przekazanej tablicy ale samej tablicy

2.
tab = probny( x, xp, xb, xb0, & s );
to tak jakbyś napisał tab = x; ?

3.


C/C++
s = 0.5;
double e = 0.01;
double alfa = 0.5;
do
{
    ...
    if(...) {...}
    else if(...) {...}
    if(...) {...}
    else if(...) {...}
   
    if(...) {....}
    else
    {
        if(...)
        {( * s ) = alfa /( 1 /( * s ) );....}
        else {...}
    }
    ....
} while( * s > e );


jak pętla  trafi to tego ifa który jest w else  i liczy s to
s= 0,25 , 0,125 0,0625 0,03125 0,015625 0,0078125

czyli jak trafi 6 raz to pętla się zakończy

dodaj do programu numerację if, i else i wyświetl ją
tzn. printf( "if 1.") );
może jeszcze jakieś Sleep(1000); na końcu pętli do
zobaczysz tendencję do których if/else wpada
to ograniczy Twoje poszukiwania i pozwoli Ci znaleźć opisywany błąd zapętlenia
P-122678
« 1 »
  Strona 1 z 1