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: #include <stdio.h> #include <stdlib.h>
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 ]; 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 ] ) ); 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 ); } 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 ] ); tab = probny( x, xp, xb, xb0, & s ); printf( "x=%f y=%f\n", x[ 0 ], x[ 1 ] ); return 0; } |
|
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. |
|
darko202 |
» 2014-12-11 12:32:59 1. zastanawiam się nad konstrukcją 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. 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 |
|
« 1 » |