Questo è un programma che risolve le equazioni di qualunque grado con il metodo di bisezione, cioè ogni volta si prende un intervallo a-b, si prende il numero che si trova in mezzo tra a e b chiamato m e si controlla se sostituendo all'equazione la x con la a, poi con la m e poi con la b, si vedono i risultati, e per esempio se i risultati sono
a negativo, m negativo e b positivo
significa che il risultato si trova tra m e b, si scarta l'intervallo a-m e la m si trasforma nella nuova in a e quindi si ricomincia da capo trovando il numero che si trova in mezzo, risostituendo etc...
questo fino a che b-a non è minore della nostra precisione che immettiamo all'inizio (es. 0.0001 cioè 4 cifre dopo la virgola)
questa è la spiegazione del metodo di wikipedia
http://it.wikipedia.org/wiki/Metodo_della_bisezione
ecco il codice
il problema è che nel runtime mi dice che c'è un accesso violento ad una locazione di memoria... ma errori sintattici nessuno e credo pure errori logici, dategli un'occhiata, il prof di matematica ce li ha lasciati oggi da fare e entro domani li vuole fatti!!!!!codice:#include "stdafx.h" #include <iostream> #include <cmath> using namespace std; long double equazione (long double); void trova (long double[],int &); int main() { long double radici[20]; int quante; long double a,b,m,pre; long double ris[3]; cout<<"Decidi la precisione \n"; cin>>pre; trova(radici,quante); cout<<quante; for(int i=0;i<=quante;i++) { a=radici[i]+1; b=radici[i]-1; m=(a+b)/2; do { ris[0]=equazione(a); ris[1]=equazione(m); ris[2]=equazione(b); if(ris[1]<0) a=m; else b=m; if(b-a<pre) break; if(fabs(a)>fabs(b)) { cout<<"Una radice e' "<<b<<endl; } else { cout<<"Una radice e' "<<a<<endl; } }while(1); } return 0; } long double equazione (long double x) { long double ris; //parte modificabile ris=2*pow(sin(x),4)-3*pow(sin(x),2)+1; return ris; } void trova (long double ris[],int & iter) { iter=0; long double temp1,temp2; temp1=equazione(-1000); for(int i=-1000;i<1000;i++) { temp2=equazione(i+1); if((temp1<0 && temp2>0) || (temp1>0 && temp2<0)) { ris[iter]=i; iter++; } if(temp2==0) { cout<<"Una radice e' "<<i+1<<endl; } temp1=temp2; } return; }
Grazie a tutti per l'aiuto che mi state dando.

Rispondi quotando