Anonimo
Anonimo ha chiesto in Computer e InternetProgrammazione e Design · 5 mesi fa

Aiuto programma in linguaggio C 10 punti!!!?

Scrivere un programma in linguaggio C, che sia in grado di trovare lo zero della funzione y = x^3 - 3

2 risposte

Classificazione
  • 5 mesi fa
    Risposta preferita

    Ciao. Come suggerisce l'altro utente conviene utilizzare il metodo di bisezione.

    Intanto prova a fare tu il programma seguendo le sue indicazioni, poi se non ci riesci puoi dare un'occhiata a quello che ho scritto io, ma non serve a niente copiarlo e incollarlo senza aver capito nulla!! Intanto provaci da solo, perché l'altro utente ha spiegato benissimo come fare.

    Ecco come l'ho fatto io

    /*Determina lo zero della funzione y=x^3 - 3 */

    #include <stdio.h>

    #include <math.h>

    #define ERR 0.001

    float funzione(float);

    int main()

    {

     float a, b, m;

     do {

      printf("Inserire 2 estremi a e b per cui le funzioni di quei 2 estremi abbiano segno discorde\n");

      printf("a: ");

      scanf("%f", &a);

      printf("b: ");

      scanf("%f", &b);

     }

     while(funzione(a) * funzione(b) > 0);

     do {

      m = (a + b) / 2;

      if(funzione(m))

      {

       if(funzione(a)*funzione(m)<0)

        b = m;

       else

        a = m;

      }

     }

     while(fabs(funzione(m)) > ERR);

     printf("ZERO DELLA FUNZIONE: %f\n", m);

     printf("f(%f) = %f\n", m, funzione(m));

     getchar();getchar();

     return 0;

    }

    float funzione(float x)

    {

     return x * x * x - 3;

    }

    N.B. Trovare lo zero assoluto di una funzione spesso richiede molto tempo e e a volte è impossibile, soprattutto con questo algoritmo che non è assolutamente efficiente.

    Perciò ho utilizzato un errore di approssimazione che puoi modificare per rendere il programma più efficiente ma con un calcolo più grossolano, oppure più preciso, ma a discapito dell'efficienza.

    Se vuoi puoi anche cambiare la funzione alla fine, in modo da poter trovare la radice di qualsiasi funzione.

    Ora è impostata su x * x * x - 3, che sarebbe la tua funzione. Ma per esempio se vuoi trovare lo 0 di X^3 - x^2 + 1 è sufficiente cambiarla e scrivere

    return x*x*x - x*x + 1

  • 5 mesi fa

    Ho visto che hai fatto già alcune domande del genere. L'idea generale è quella di usare in questo caso il metodo di bisezione. Guardando il grafico della funzione: https://www.wolframalpha.com/input/?i=plot+y%3Dx%5... si vede che sicuramente lo zero di questa funzione cade nell'intervallo (1,2) e quindi puoi partire da a = 1 e b=2. La premessa fondamentale è il teorema degli zeri: 

    𝗧𝗲𝗼𝗿𝗲𝗺𝗮 𝗱𝗲𝗴𝗹𝗶 𝘇𝗲𝗿𝗶 Assegnata una funzione f reale di variabile reale e un intervallo [a,b] tale che f(a)f(b)<0 (cioè la f prende valori di segno opposto ai due estremi) ed f è continua in [a,b], esiste almeno un punto x in tale intervallo tale che f(x) = 0. 

    I polinomi e somme, prodotti di polinomi di variabili reali sono continui su tutta la retta reale quindi il teorema è applicabile. Sia f(x) = x³ - 3

    1- Poniamo a = 1 e b = 2. Come si vede dal grafico la f prende valori di segno opposto in a ed in b e quindi è un buon intervallo. 

    2- Si prende il punto medio dell'intervallo, c = (b+a)/2. Può darsi che la f assuma in c un valore con lo stesso segno di f(a) oppure con lo stesso segno di f(b). 

    2.1 -> Se f assume in c valore dello stesso segno di f(a) allora l'intervallo [c,b] verifica nuovamente le ipotesi del teorema degli zeri: f(c)f(b) < 0

    2.2 -> Se la f assume in c valore dello stesso segno di f(b) allora l'intervallo [a,c] verifica nuovamente le ipotesi del teorema degli zeri: f(a)f(c) < 0

    3-> A seconda dei casi si riparte dal punto 2 sull'intervallo [c,b] se si verifica (2.1) oppure sull'intervallo [a,c] se si verifica (2.2), finché non si raggiunge la precisione desiderata.

    ------------------------------------------------------

    𝗖𝗼𝗻𝘀𝗶𝗱𝗲𝗿𝗮𝘇𝗶𝗼𝗻𝗶: Ogni volta prendi come approssimazione dello zero della funzione il punto medio dell'intervallo, e quindi l'errore massimo che commetti approssimando lo zero con tale punto è pari alla metà dell'ampiezza dell'intervallo; tale errore è massimo quando in realtà la soluzione è una dei due estremi. In generale si dimostra che l'errore al passo k verifica 

    eₖ ≤ (b-a)/2ᵏ⁺¹ 

    Da cui invertendo la formula rispetto a k ottieni che 

    k ≥ log₂( (b-a)/eₖ ) - 1

    Usando a = 1, b = 2 ed eₖ = 0.1 si trova che k ≥ 2.32 (approssimativamente). Poiché k deve essere un numero naturale nel tuo caso ti puoi fermare dopo k = 3 passaggi per ottenere lo zero con una precisione di almeno 0.1. Lascio a te l'onore di implementare in codice questa idea.  

Altre domande? Fai una domanda e ottieni le risposte che cerchi.