Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2016
    Messaggi
    4

    [C] Radici reali equazione cubica

    Buongiorno a tutti, ho un problema con questo programma:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #define PI 3.141596
    //Programma per la risoluzione di equazione cubica /*
    
    
    
    float  main()
    {
    float a,b,c,d,x1,x2,x3,p,q,a_sq,a_cub,b_sq,b_cub,q_sq,p_cub,delta,A,B,theta,k,w,t;
    printf("L'equazione è nella forma ax^3+ bx^2+ cx+ d = 0\n" );
    printf("inserisci a:");
    scanf("%f",&a);
    printf("inserisci b:");
    scanf("%f",&b);
    printf("inserisci c:");
    scanf("%f",&c);
    printf("inserisci d:");
    scanf("%f",&d);
    //calcolo p e q
    a_sq = pow(a,2);
    a_cub = pow(a,3);
    b_sq = pow(b,2);
    b_cub = pow(b,3);
    
    //calcolo p;q;delta//
    
    p = (3*a*c - b_sq)/(3*a_sq);
    q = (2*b_cub - 9*a*b*c + 27*a_sq*d)/(27*a_cub);
    printf("p = %f",p);
    
    
    if(p < 0)  // tre soluzioni reali
    {
    A = 2*sqrt(-p/3);
    B = -b/3*a;
    t = (3*q)/(A*p);
    theta = (acos(t));
    k = theta + 2*PI;
    w = theta + 4*PI;
    x1 = A*cos(theta/3) + B;
    x2 = A*cos(k/3) +B;
    x3 = A*cos(w/3) + B;
    printf("\nA = %f",A );
    printf("\ntheta = %f",theta);
    printf("\nx1 = %f\nx2 = %f\nx3 = %f",x1,x2,x3);
    }
    else if (p > 0)  //una soluzione reale
    {
    A = 2*sqrt(p/3);
    t = (3*q)/(A*p);
    theta = asinh(t);
    x1 = (-A)*sinh(theta/3);
    printf("\nA = %f",A );
    printf("\ntheta = %f",theta);
    printf("\nx1 = %f",x1);
    
    }
    return 0;
    }
    In pratica il programma funziona ma i risultati stampati non sono sempre corretti.
    Le formule le ho prese da http://www.chem.mtu.edu/~tbco/cm3230...c_Equation.pdf

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    In quale caso non sono corretti?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2016
    Messaggi
    4
    se ad esempio imposto a=1;b=-10;c=7;d=1 stampa le tre soluzioni esatte. Se imposto altri valori non sempre i risultati sono esatti, sia nel caso p<0 sia p>0.
    Purtroppo non ho trovato un trend negli errori e non capisco dove ( e come) correggere il codice.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Quote Originariamente inviata da euron92 Visualizza il messaggio
    se ad esempio imposto a=1;b=-10;c=7;d=1 stampa le tre soluzioni esatte. Se imposto altri valori non sempre i risultati sono esatti, sia nel caso p<0 sia p>0.
    Purtroppo non ho trovato un trend negli errori e non capisco dove ( e come) correggere il codice.
    Io ti avevo chiesto un caso in cui sono sbagliati ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    controlla qui,
    B = -b / (3 * a);

    nell'esempio che funziona, a e d sono ininfluenti nelle moltiplicazioni e divisioni
    Ultima modifica di marino51; 06-07-2016 a 10:57

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2016
    Messaggi
    4
    B = -b/(3*a) è corretto.
    Comunque per a=2; b=-4; c=-2; d=3, mi stampa x1=4.1397; x2=1.088; x3=2.770 mentre invece dovrebbe venire 2.139;-0.9100;0.770.
    Che possa essere un errore di conversioni da gradi a radianti nelle funzioni goniometriche?

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    si, so che è corretto, net tuo sw mancano le parentesi tonde.
    {
    A = 2*sqrt(-p/3);
    B = -b/3*a;
    t = (3*q)/(A*p);

  8. #8

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 © 2026 vBulletin Solutions, Inc. All rights reserved.