Formula di Cardano per equazione cubica

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Formula di Cardano per equazione cubica

    Corretto.
    OK adesso funziona, però non mi stampa i risultati negativi. Per esempio per a = b=c=d= -1 mi esce:
    
    x1 = -1.#ind00
    
    
  • Re: Formula di Cardano per equazione cubica

    E' un problema di calcolo della radice cubica negativa con la potenza. Utilizza le seguenti linee per calcolare v
    
    float xx=r-k; float xxs=(xx<0)?-1.0:1.0;
    v = xxs*pow(abs(xx),(float)1.0/3);
    
  • Re: Formula di Cardano per equazione cubica

    
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #define PI 3.141596
    //Programma per la risoluzione di equazione cubica con formula di Cardano/*
    
    
    
    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,k,u,v,r;
    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 delta
    p = c/a-(b_sq)/(3*a_sq);
    q = d/a-(b*c)/(3*a_sq) +(2*b_cub)/(27*a_cub);
    q_sq = pow(q,2);
    p_cub = pow(p,3);
    delta = (q_sq/4 +p_cub/27);
    k= sqrt(delta);
    r= (-q/2);
    
    u = pow((r+k),(float)1.0/3);
    
    float xx=r-k; float xxs=(xx<0)?-1.0:1.0;
    v = xxs*pow(abs(xx),(float)1.0/3);
    
    
    
    /*****************/
    if(delta > 0) //L'equazione ha una soluzione reale
    {
    x1 = u + v;
    printf("\nx1 = %f",x1);
    
    }
    
    else if(delta == 0) //L'equazioni ha tre soluzioni reali
    {
    float w = pow((q/2),(float)1.0/3);
    x1 = -2*w;
    x2 = w;
    x3 = w;
    printf("\nx1 = %f\nx2 = %f\nx3 = %f",x1,x2,x3);
    }
    else if(delta < 0) //L'equazioni ha tre soluzioni reali
    {
    float t = sqrt(-delta);
    float theta = atan(t/(-q/2));
    float h = 2*sqrt(-p/3);
    x1 = h*cos(theta/3);
    x2 = h*cos((theta+2*PI)/3);
    x3 = h*cos((theta+4*PI)/3);
    printf("\nx1 = %f\nx2 = %f\nx3= %f\n",x1,x2,x3);
    }
    
    }
    
    
    
    

    Scusa se rispondo adesso ma ero al lavoro.
    Comunque adesso stampa i risultati sbagliati. Ho provato a controllare di nuovo le formule usate ma non riesco a trovare errori.
  • Re: Formula di Cardano per equazione cubica

    Devi essere più preciso quando rispondi altrimenti perdiamo tempo... Quali risultati? Cosa hai provato?
  • Re: Formula di Cardano per equazione cubica

    Inserisco i parametri e mi stampa dei risultati che non sono le soluzioni dell'equazione.
  • Re: Formula di Cardano per equazione cubica

    Decisamente non ci capiamo ...
  • Re: Formula di Cardano per equazione cubica

    
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #define PI 3.141596
    //Programma per la risoluzione di equazione cubica con formula di Cardano/*
    
    
    
    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,k,u,v,r;
    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 delta
    p = c/a-(b_sq)/(3*a_sq);
    q = d/a-(b*c)/(3*a_sq) +(2*b_cub)/(27*a_cub);
    q_sq = pow(q,2);
    p_cub = pow(p,3);
    delta = (q_sq/4 +p_cub/27);
    k= sqrt(delta);
    r= (-q/2);
    
    u = pow((r+k),(float)1.0/3);
    
    float xx=r-k; float xxs=(xx<0)?-1.0:1.0;
    v = xxs*pow(abs(xx),(float)1.0/3);
    
    
    
    /*****************/
    if(delta > 0) //L'equazione ha una soluzione reale
    {
    x1 = u + v;
    printf("\nx1 = %f",x1);
    
    }
    
    else if(delta == 0) //L'equazioni ha tre soluzioni reali
    {
    float w = pow((q/2),(float)1.0/3);
    x1 = -2*w;
    x2 = w;
    x3 = w;
    printf("\nx1 = %f\nx2 = %f\nx3 = %f",x1,x2,x3);
    }
    else if(delta < 0) //L'equazioni ha tre soluzioni reali
    {
    float t = sqrt(-delta);
    float theta = atan(t/(-q/2));
    float h = 2*sqrt(-p/3);
    x1 = h*cos(theta/3);
    x2 = h*cos((theta+2*PI)/3);
    x3 = h*cos((theta+4*PI)/3);
    printf("\nx1 = %f\nx2 = %f\nx3= %f\n",x1,x2,x3);
    }
    
    }
    
    Intendo dire che ho controllato tutte le formule usate per trovare le radici dell' equazione ma non non mi sembra che ci siano errori.
    Le formule le ho prese da , quando avvio il programma mi chiede di inserire i parametri ma stampa i risultati sbagliati
    Per esempio: per a= -12, b=-4, c=3, d=1
    mi stampa
    
    x1 = 0.6111111
    x2 = -0.3888890
    x3 = -0.2222220
    
    quando ince dovrebbe stampare x1 =0.499999 x2 =-0.5 x3=-0.3333333
Devi accedere o registrarti per scrivere nel forum
21 risposte