Metodo di powell

di il
20 risposte

Metodo di powell

Qualcuno mi puoi aiutare sull'implementazione del metodo di powell?
Il mio problema nasce quando devo ssegnare a una variabile un'espressione che è funzione di un parametro che è la mia incognita.

20 Risposte

  • Re: Metodo di powell

    Riporto quel poco di programma che ho scritto

    #include<stdio.h>
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;

    int main(int argc, char *argv[])
    {
    int i,N;

    N=2;
    int s1[2]={1, 0};
    int s2[2]={0, 1};
    double x[2];
    double f(x[2]);
    printf("inserisci le coordinate del punto iniziale");
    scanf(" %lf %lf", &x[0], &x[1]);
    f=2*x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
    double y[2];
    double alpha;

    double aux;
    for(i=0; i<=N-1; i= i+1) {
    aux=(x+ alpha*s1);
    y=aux;
    }
    printf("%g %g\n", y[0], y[1]);







    system("PAUSE");
    return EXIT_SUCCESS;
    }

    y[0] e y[1] sono in funzione di alpha, però così com l'ho scritto il programma associa ad alpha il valore zero ed ha ragione. Come devo fare? grazie
  • Re: Metodo di powell

    Cos'è questo?
    
    double f(x[2]);
    
  • Re: Metodo di powell

    Essendo f funzione di x[0] e x[1], pensavo che si potesse scrivere f(x[2]). Per quanto riguarda la domanda principale mi sai dire qualcosa? Grazie per la risposta
  • Re: Metodo di powell

    Ho rivisto un pò di teoria, forse dovevo scrivere f( double x[2]). Giusto?
  • Re: Metodo di powell

    Allora ripassa ancora un pò di teoria. Per quanto riguarda la domanda principale non posso risponderti ma ti posso aiutare a scrivere un codice corretto.vedi come hai scritto il main? tipoVariabileDiRitorno nomeFunzione(parametri). Non puoi definire una funzione dentro una funzione quindi la funzione f va definita fuori. double f(double x[2]) può essere una forma corretta.
  • Re: Metodo di powell

    Ti ringrazio per avermi risposto così velocemente.
    Ho dichiarato la funzione fuori dal main

    #include<stdio.h>
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;

    double f(double x[2])
    {
    return 2*x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
    };


    int main(int argc, char *argv[])
    {
    int i,N;

    N=2;
    int s1[2]={1, 0};
    int s2[2]={0, 1};


    printf("inserisci le coordinate del punto iniziale");
    scanf(" %lf %lf", &x[0], &x[1]);

    double y[2];
    double K=2;

    double aux;
    for(i=0; i<=N-1; i= i+1) {
    aux=(x+ K*s1);
    y=aux;
    }
    printf("%g %g\n", y[0], y[1]);







    system("PAUSE");
    return EXIT_SUCCESS;
    }

    quando compilo il programma mi dà il seguente errore:
    23 C:\Documents and Settings\Administrator\Desktop\tesina\provaY1.cpp `x' undeclared (first use this function)

    Dove sbaglio?
  • Re: Metodo di powell

    Devi dichiarare x all'interno del main. la x nella funzione f non centra niente con la x del main. quindi:

    nel main:
    
    double x[2];
    
    la funzione f cosa dovrebbe fare?
  • Re: Metodo di powell

    Fatto... ora è ok.
    Ora ritorna il mio problema, perchè nel programma che ho inserito K=2, nella realtà K (nel mio primo messaggio K=alpha) non so quanto vale, perchè è la mia incognita. Dovrei ottenere in output y[0] e y[1] in funzione di K per poi andare a sostituire questi valori nella mia f al posto di x[0] e x[1].Aiutami, perchè sono a corto di idee
  • Re: Metodo di powell

    Mah se la matematica non mi inganna:
    
    aux=(x[i]+ K*s1[i]);
    y[i]=aux;
    
    equivale a :
    y[i]=(x[i]+ K*s1[i]);
    
    quindi K = (y[i] - x[i]) / s1[i];
    
    tu hai 2 equazioni con 3 incognite: come pensi di ricavare K, y0 e y1 con così pocchi dati?
  • Re: Metodo di powell

    Hai ragione... Infatti per il momento io non devo ancora calcolare il valore di K, ma ottenere y[0] e y[1] in funzione di K. Ad esempio y[0]= 2+K e y[1]=1+K, poi devo prendere questi valori e calcolare la f sostituendo a x[0] il valore di y[0] (sempre in funzione di K) e a x[1] il valore di y[1]. Spero di essere stato abbastanza chiaro
  • Re: Metodo di powell

    Si ma la funzione f ti ritorna un double (valore unico) cosa ci fai con sto double? Quello sarà il tuo vero K?

    Allora forse ho capito:
    
    double f(double y[2]) // quì li passi y0 e y1
    {
        return (K*y[0]*y[0]) + (y[1]*y[1]) - (y[0]*y[1]);
    }; 
    
    il valore di ritorno cos'è.
  • Re: Metodo di powell

    Una volta sostituiti i valori nella f, dovrò calcolare la derivata porla uguale a zero e dopo calcolare K. Il double che dovrà restituire la mia funzione sarà il minimo della funzione stessa. Non ce la farò mai!
  • Re: Metodo di powell

    Perche tu pensi in matematica e io in C. Scrivilo come una espressione matematica e vediamo se si può scrivere in linuaggio di programmazione
  • Re: Metodo di powell

    Inserendo la parte che mi hai consigliato:
    #include <stdio.h>
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;

    double f(double x[2])
    {
    return 2*x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
    };


    int main(int argc, char *argv[])
    {
    double x[2];
    int i,N;

    N=2;
    int s1[2]={1, 0};
    int s2[2]={0, 1};


    printf("inserisci le coordinate del punto iniziale");
    scanf(" %lf %lf", &x[0], &x[1]);

    double y[2];
    double K;

    for(i=0; i<=N-1; i= i+1) {

    y=(x+ K*s1);

    };
    double f(double y[2])
    {
    return (K*y[0]*y[0]) + (y[1]*y[1]) - (y[0]*y[1]);
    };

    printf("la f vale %g", &f);







    system("PAUSE");
    return EXIT_SUCCESS;
    }
    Durante la compilazione mi dà il seguente errore:
    35 C:\Documents and Settings\Administrator\Desktop\tesina\provaY1.cpp a function-definition is not allowed here before '{' token
    35 C:\Documents and Settings\Administrator\Desktop\tesina\provaY1.cpp expected `,' or `;' before '{' token
Devi accedere o registrarti per scrivere nel forum
20 risposte