PDA

Visualizza la versione completa : Linguaggio C - Metodo di bisezione per zeri di funzione


AmedeoFalco
18-10-2017, 20:39
Salve ragazzi mi sono imbattuto in queste esercizio che mi dice di trovare gli zeri di una funzione(scelta a caso) tramite il metodo di bisezione degli intervalli.

La mia idea era la seguente:


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

void Bis( float *piG, float *pi_g){
int n;
printf("Digita l'approssimazione: ")
scanf("%d",&n);

float x[n];

for(int i=1;i<=n;i++){

//1 x[i]=(*piG+*pi_g)/(pow(2,i)) ; //questa Ŕ la generalizzazione della bisezione
}
for(int i=1;i<=n;i++){
//2 if(sin(x[i])==0){
printf("Gli zeri di funzione sono %.2f" , x[i]);

}

int main () {

float piG=4,71 //corrispondente a 2/3 piGreco
float pi_g=1,57 //corrispondente a 1/2 piGreco

Bis(&piG,&pi_g);

return 0;

}



Quindi la mia idea era dare la possibilitÓ di scegliere a me l'approssimazione, conoscendo giÓ l'intervallo su cui calcolare la bisezione, salvare i risultati in un vettore e dopo dichŔ vedere tutti quei valori talichŔ rendevano 0 la funzione seno! Solo che il compilatore mi dice che c'Ŕ un'invalida assegnazione per il vettore sia nel punto 1) che 2) del programma!! Cosa c'Ŕ di sbagliato?? :D

linoma
18-10-2017, 22:06
Nn puoi allocare un vettore di float in quel modo, devi usare tipo quest righe:



float *x = (float *)malloc(sizeof(foat)*n)

oregon
19-10-2017, 07:42
Se il compilatore la supporta quell'allocazione va bene.

Quello che Ŕ sbagliato Ŕ il ciclo for che non pu˛ andare da 1 a n ma da 0 a n-1

AmedeoFalco
19-10-2017, 21:21
Salva ragazzi!! Si avete ragione entrambi ho usato malloc e poi il vettore( ho fatto un errore stupido) parte da 0 non da 1 !! Comunque con un p˛ di revisione ci sono arrivato :D ma come sempre ci ringrazio per aver risposto!!


#inculde<iostream>
#include<studio.h>
#include<math.h>
#include<cstdlib>

void Bis( float *piG, float *pi_g){

int n;
printf("Digita l'approssimazione: ");
scanf("%d",&n);

float *ptrF = (float*) malloc(n * sizeof(float));

for(int i=0;i<n;i++) {
ptrF[i]=(*piG+*pi_g)/(pow(2,i+1)); //questa Ŕ la generalizzazione della bisezione

}



for(int i=0;i<n;i++) {
if(fabs(sin(ptrF[i])) < 0.0000001) {
printf("Gli zeri di funzione sono %.8f\n" , ptrF[i]);
}
}
free(ptrF);
ptrF = NULL;

return;

}
int main () {

float piG = 4.71238898; //corrispondente a 2/3 piGreco
float pi_g = 1.57079633; //corrispondente a 1/2 piGreco
Bis(&piG, &pi_g);

return 0;

}

Loading