Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    Aiuto per programmino in C

    Salve ragazzi sono alle prime armi e mi servirebbe un a mano per la creazione di un programma in C o C++
    Il mio problema è questo, devo utilizzare il metodo della bisezione(o un qualunque altro metodo per la ricerca degli zeri di una funzione) per risolvere la seguente equazione:

    A*sen(X)+B*cos(X)-C = 0

    Dove A, B, C sono delle costanti che possiamo porre uguali a quanto scriverò:

    A=200
    B=25
    C=160

    Quello che voglio conoscere tramite la risoluzione dell'equazione è il valore che assume l'unica incognita ovvero la X, tramite il metodo di bisezione(è l'unico metodo che mi viene in mente per la ricerca degli zeri di una funzione).
    Se ci sono altri metodi sarò contento di vedere come saranno i programmi con altri metodi...

    GRAZIE

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461

    Moderazione

    Proponi la tua soluzione al problema, giusta o sbagliata che sia, oppure spiega i dubbi che ti impediscono di risolvere l'esercizio, e noi vedremo come darti una mano.

    Qui non si fanno i compiti a casa su commissione...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ecco il programma che "in teoria" dovrebbe servire per la ricerca degli zeri della funzione:
    Non capisco l'inghippo, perfavore aiutatemi!

    La parte di programma commentata dovrebbe essere inutile per la risoluzione del problema in quanto io voglio trovare una sola soluzione, mentre mi servirebbe se volessi trovare 2 soluzioni(per funzioni più complesse).
    Il problema è che quando lo vado ad eseguire, non mi da il risultato...
    Ovvero inserisco i due valori degli estremi a, b che corrispondono a zero e "2 pi greco"
    Ovvero a=0
    b=6.28

    Però non mi da il risultato...
    E' giusto come programma? Dove sbaglio?

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

    int main(){
    /* vengono definite le variabili*/
    int n=0,n1=0,n2=0;
    double a,b,x,x1,x2;
    double fa,fb,fc,fx,fx1,fx2;
    double errx,errx1,errx2;

    printf("Occorrono due estremi a e b di un intervallo all'interno del\n");
    printf("quale cercheremo un valore x soluzione dell'equazione f(x)=0\n");
    printf("*** Attenzione! a e b devono essere tali che f(a)*f(b)<0 ***\n");

    printf(" Estremo inferiore?\n");
    scanf("%lf", &a);

    fa = 200*sin(a)+25*cos(a)-160;

    printf(" Estremo superiore?\n");
    scanf("%lf", &b);

    fb = 200*sin(b)+25*cos(b)-160;

    printf("\n");

    fc=fa*fb;

    if(fc < 0.){

    do {

    x =(a + b) * 0.5;

    fx = cos(x)-sin(x);

    n=n+1;

    if( fx == 0. ) {

    printf("Trovo uno zero in %25.20g\n",x);

    return false;

    }

    if( fa*fx < 0. ) {

    b = x;

    fb = fx;

    }

    else {

    a = x;

    fa = fx;

    }

    errx = fabs( (b-a) * 0.5 );

    } while(errx >= 1.e-15);

    printf("Trovo uno zero in %25.20g +/- %g \n",x,errx);
    printf("Converge in %d passi\n",n-1);

    }

    /*else (fc>0);
    {

    printf("***Attenzione! Nell'intervallo non esistono due valori di x\n");
    printf("per cui f(x)=0\n");

    x =(a + b) * 0.5;

    fx = cos(x)-sin(x);

    n1=n1+1;

    n2=n2+1;

    if( fx == 0. ){

    printf("Trovo uno zero in %25.20g\n",x);

    return false ;

    }

    if( fa*fx < 0. ) {

    b = x;

    fb = fx;

    do {

    x1=(a+b)*0.5;

    fx1=cos(x1)-sin(x1);

    n1=n1+1;

    if( fa*fx1 < 0. ) {

    b = x1;

    fb = fx1;

    }

    else {

    a = x1;

    fa = fx1;

    }

    errx1 = fabs( (b-a) * 0.5 );

    } while(errx1 >= 1.e-15);
    }

    printf("Trovo uno zero in %25.20g +/- %g \n",x1,errx1);
    printf("Converge in %d passi\n",n1);

    if( fb*fx < 0. ){

    a = x;

    fa = fx;

    do {

    x2=(a+b)*0.5;

    fx2=cos(x2)-sin(x2);

    n2=n2+1;

    if( fa*fx2 < 0. ) {

    b = x2;

    fb = fx2;

    }

    else {

    a = x2;

    fa = fx2;

    }

    errx2 = fabs( (b-a) * 0.5 );

    } while(errx2 >= 1.e-15);

    }

    printf("Trovo uno zero in %25.20g +/- %g \n",x2,errx2);
    printf("Converge in %d passi\n",n2);*/
    system ("PAUSE");
    }
    /*} */

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461

    Moderazione

    Originariamente inviato da krampuler
    Ecco il programma [...]
    Usa il tag [CODE] per delimitare il codice e formattarlo adeguatamente sul server.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Ok mi scuso con lo staff
    Ecco qui:

    codice:
     #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    int main(){
    /* vengono definite le variabili*/
    int n=0,n1=0,n2=0;
    double a,b,x,x1,x2;
    double fa,fb,fc,fx,fx1,fx2;
    double errx,errx1,errx2;
    
    printf("Occorrono due estremi a e b di un intervallo all'interno del\n");
    printf("quale cercheremo un valore x soluzione dell'equazione f(x)=0\n");
    printf("*** Attenzione! a e b devono essere tali che f(a)*f(b)<0 ***\n");
    
    printf(" Estremo inferiore?\n");
    scanf("%lf", &a);
    
    fa = 200*sin(a)+25*cos(a)-160;
    
    printf(" Estremo superiore?\n");
    scanf("%lf", &b);
    
    fb = 200*sin(b)+25*cos(b)-160;
    
    printf("\n");
    
    fc=fa*fb;
    
    if(fc < 0.){
    
    do {
    
    x =(a + b) * 0.5;
    
    fx = cos(x)-sin(x);
    
    n=n+1;
    
    if( fx == 0. ) {
    
    printf("Trovo uno zero in %25.20g\n",x);
    
    return false;
    
    }
    
    if( fa*fx < 0. ) {
    
    b = x;
    
    fb = fx;
    
    }
    
    else {
    
    a = x;
    
    fa = fx;
    
    }
    
    errx = fabs( (b-a) * 0.5 );
    
    } while(errx >= 1.e-15);
    
    printf("Trovo uno zero in %25.20g +/- %g \n",x,errx);
    printf("Converge in %d passi\n",n-1);
    
    }
    
    /*else (fc>0);
    {
    
    printf("***Attenzione! Nell'intervallo non esistono due valori di x\n");
    printf("per cui f(x)=0\n");
    
    x =(a + b) * 0.5;
    
    fx = cos(x)-sin(x);
    
    n1=n1+1;
    
    n2=n2+1;
    
    if( fx == 0. ){
    
    printf("Trovo uno zero in %25.20g\n",x);
    
    return false ;
    
    }
    
    if( fa*fx < 0. ) {
    
    b = x;
    
    fb = fx;
    
    do {
    
    x1=(a+b)*0.5;
    
    fx1=cos(x1)-sin(x1);
    
    n1=n1+1;
    
    if( fa*fx1 < 0. ) {
    
    b = x1;
    
    fb = fx1;
    
    }
    
    else {
    
    a = x1;
    
    fa = fx1;
    
    }
    
    errx1 = fabs( (b-a) * 0.5 );
    
    } while(errx1 >= 1.e-15);
    }
    
    printf("Trovo uno zero in %25.20g +/- %g \n",x1,errx1);
    printf("Converge in %d passi\n",n1);
    
    if( fb*fx < 0. ){
    
    a = x;
    
    fa = fx;
    
    do {
    
    x2=(a+b)*0.5;
    
    fx2=cos(x2)-sin(x2);
    
    n2=n2+1;
    
    if( fa*fx2 < 0. ) {
    
    b = x2;
    
    fb = fx2;
    
    }
    
    else {
    
    a = x2;
    
    fa = fx2;
    
    }
    
    errx2 = fabs( (b-a) * 0.5 );
    
    } while(errx2 >= 1.e-15);
    
    }
    
    printf("Trovo uno zero in %25.20g +/- %g \n",x2,errx2);
    printf("Converge in %d passi\n",n2);*/
    system ("PAUSE");
    }
    /*} */

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'utilità dei tag code sta nel fatto che, utilizzandoli, il codice conservi l'indentazione con cui è stato scritto e risulti più leggibile. Se tu però fai il copia e incolla del codice che hai postato all'inizio (che non è indentato) e lo metti tra quei tag, non è che ottieni qualche risultato migliore, come puoi vedere.

    Comunque vabbè, i problemi sono due.

    Innanzitutto questa funzione

    200 * sin(x) + 25 * cos(x) - 160

    in 0 e 6.28 non assume valori di segno opposto

    codice:
    octave:1> 200 * sin(0) + 25 * cos(0) - 160
    ans = -135
    octave:2> 200 * sin(2*pi) + 25 * cos(2*pi) - 160
    ans = -135.64
    quindi l'algoritmo non inizia proprio. Tra l'altro, seno e coseno sono funzioni periodiche di 2*pi, quindi risulta anche ovvio che in 0 e 2*pi la funzione nel complesso assuma lo stesso valore (a meno di qualche approssimazione).

    In secondo luogo, perché all'inizio valuti proprio quella funzione in a e b e poi per calcolare ad ogni passo il valore della funzione nel punto medio utilizzi

    codice:
    ...
    fx = cos(x)-sin(x);
    ...
    ? Mi pare che la funzione sia diversa.

    Aggiusta quella riga e poi stabilisci come intervallo qualcosa di valido, come [0, pi/2], dove pi/2 è circa 1.57.

    Un consiglio: false è una parola riservata del C++, in C non esiste. Sostituisci quel "false" con 0, che poi tra l'altro sarebbe logicamente insensato terminare un programma (se l'esecuzione è andata a buon fine) con "return false", per quanto semanticamente corretto: 0 in quel caso indica convenzionalmente "success", non "false". Se proprio vuoi ricorrere a qualcosa di simile, usa la costante simbolica EXIT_SUCCESS definita in stdlib.
    every day above ground is a good one

  7. #7
    Si ho visto gli errori ed ho subito corretto...
    Ho corretto sia la riga dove ho inserito il false, sostituendolo con 0, ed anche la riga dove avevo calcolato ad ogni passo il valore della funzione nel punto medio utilizzando la funzione sbagliata...
    Infine ho cambiato gli estremi mettendo 0 e pi/2 approssimandolo a circa 1.57
    Ecco il programma sul quale vorrei porre ancora qualche domanda, e mi scuso per la mia "cattiva conoscenza" di tali argomenti spero di poter imparare stando a contatto con voi...
    codice:
     #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    int main(){
    /* vengono definite le variabili*/
    int n=0,n1=0,n2=0;
    double a,b,x,x1,x2;
    double fa,fb,fc,fx,fx1,fx2;
    double errx,errx1,errx2;
    
    printf("Occorrono due estremi a e b di un intervallo all'interno del\n");
    printf("quale cercheremo un valore x soluzione dell'equazione f(x)=0\n");
    printf("*** Attenzione! a e b devono essere tali che f(a)*f(b)<0 ***\n");
    
    printf(" Estremo inferiore?\n");
    scanf("%lf", &a);
    
    fa = 200*sin(a)+25*cos(a)-160;
    
    printf(" Estremo superiore?\n");
    scanf("%lf", &b);
    
    fb = 200*sin(b)+25*cos(b)-160;
    
    printf("\n");
    
    fc=fa*fb;
    
    if(fc < 0.){
    
    do {
    
    x =(a + b) * 0.5;
    
    fx = 200*sin(b)+25*cos(b)-160 ;
    
    n=n+1;
    
    if( fx == 0. ) {
    
    printf("Trovo uno zero in %25.20g\n",x);
    
    return 0;
    
    }
    
    if( fa*fx < 0. ) {
    
    b = x;
    
    fb = fx;
    
    }
    
    else {
    
    a = x;
    
    fa = fx;
    
    }
    
    errx = fabs( (b-a) * 0.5 );
    
    } while(errx >= 1.e-15);
    
    printf("Trovo uno zero in %25.20g +/- %g \n",x,errx);
    printf("Converge in %d passi\n",n-1);
    
    }
    
    system ("PAUSE");
    }

    Il problema è che il risultato che mi viene fuori è di circa 0.784999
    Il problema è che purtroppo questo risultato non soddisfa l'equazione iniziale, ovvero

    200 * sin(x) + 25 * cos(x) - 160= 0

    In quanto per trovare l'angolo x , dovrò fare l'arcosen(0.784999)= 51.719°
    Ed è facile verificare che l'angolo in questione non soddisfa l'equazione principale, mentre dai calcoli "fatti a mano" scopro che l'angolo dovrebbe essere di circa 45.41°
    Come mai accade questo?
    Ed inoltre perchè cambiando i valori attribuiti all'estremo superiore(facendo rimanere l'estremo inferiore sempre uguale a zero) il risultato varia notevolmente?

  8. #8
    Originariamente inviato da krampuler
    dovrò fare l'arcosen(0.784999)= 51.719°
    A prima vista mi sembra che il valore che trovi 0.784999 è già la misura dell'angolo x in radianti. Devi quindi trasformarlo da radianti in gradi sessagesimale.

    In ogni modo:
    codice:
    200 * sin(0.784999) + 25 * cos(0.784999) - 160 = -0.950380856850643
    quindi 0.784999 è un po' lontanuccio dall'essere uno zero della funzione.
    ;-)

  9. #9
    Ehm, quindi come posso procedere?
    Dove sbaglio nel programma?

  10. #10
    Originariamente inviato da krampuler
    Ehm, quindi come posso procedere?
    Dove sbaglio nel programma?
    sostituisci:
    codice:
    fx = 200*sin(b)+25*cos(b)-160;
    con
    codice:
    fx = 200*sin(x)+25*cos(x)-160;
    dando in input 0 e 1 si ottiene come risultato:
    0.79271360272430335669 radianti (che trasformato in gradi sessagesimali è: 45.41914379871)

    codice:
    200 * sin(0.79271360272430335669) + 25 * cos(0.79271360272430335669) - 160 = -1.70530256582424e-13
    ;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.