PDA

View Full Version : [c] Piano cartesiano e distriduzione normale


frizzo28
25-02-2007, 09:41
Ciao a tutti dovrei realizzare il seguente programma:
"Realizzare un programma che dato in input media e varianza sia in grado di disegnare sul piano cartesiano il grafico di una distribuzione normale";
x calcolare la normale ho scritto la formula e funziona ora il problema è come faccio a fare il grafico dato che il risultato della funzione è sempre un numero tio 0.00457?

il grafico dovrebbe essere tipo l'immagine allegata:



P.S. Come compilatore uso turbo c++ della borland
grazie
ciao

AYAMY
25-02-2007, 10:14
Ciao frizzo.. scusa se ti disturbo.. volevo sapere se potevi postare il codice relativo alla distribuzione normale...
Anche io sto lavorando con le gaussiane... (in particolare sto creando un vettore di valori che graficati dovrebbero generare una gaussiana)....
Grazie ancora!!!
Mi spiace non poterti aiutare nello specifico.. ma forse per graficare ti dovresti appoggiare a delle librerie esterne...
ciao e grazie ancora!!

frizzo28
25-02-2007, 11:58
Ciao frizzo.. scusa se ti disturbo.. volevo sapere se potevi postare il codice relativo alla distribuzione normale...
Anche io sto lavorando con le gaussiane... (in particolare sto creando un vettore di valori che graficati dovrebbero generare una gaussiana)....
Grazie ancora!!!
Mi spiace non poterti aiutare nello specifico.. ma forse per graficare ti dovresti appoggiare a delle librerie esterne...
ciao e grazie ancora!!


Questo è il codice non sono sicurissimo che sia giusto a me pare funzioni...
il problema è per la grafica
#include<conio.h>
#include<iostream.h>
#include<graphics.h>
#include<math.h>

double normale(int x,int m,int var);

void main()

{

double ris,max=0.0;
int x,m,var;
clrscr();
//Dati programma

m=7;
var=12;
//Fine Dati programma

ris=normale(x,m,var);

cout<<ris;
getch();

}



double normale(int x,int m,int var)
{
double e=2.71828;
double sca,appo,p;
sca= sqrt(var);
appo=-(pow(x-m,2)/(2*var));
p=(1/(sca*sqrt(2*M_PI)))*pow(e,appo);
return p;
}

repne scasb
25-02-2007, 16:29
A meno di errori grossolani:


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

#define SCREEN_X 79
#define SCREEN_Y 19
#define PI 3.14159265359

void main(void)

{
char table_g[SCREEN_X][SCREEN_Y];
float min_x,max_x,step_x,s,m,a=4.,b=1.;
int i,j,c;

printf("Varianza: ");
scanf("%f",&s);

printf("Media: ");
scanf("%f",&m);

do
{
for(i=0;i<SCREEN_X;i++)
{
for(j=0;j<SCREEN_Y;j++)
table_g[i][j]=' ';
}

min_x=m-a*s;
max_x=m+a*s;
step_x=(max_x-min_x)/(SCREEN_X-1);

for(i=0;i<SCREEN_X;i++)
{
/* j=1./(sqrt(2*PI*s))*exp(-pow(min_x+i*step_x-m,2)/(2*s))*SCREEN_Y;*/
j=exp(-pow(min_x+i*step_x-m,2)/(2*s))*SCREEN_Y*b;
if(j<SCREEN_Y)
table_g[i][j]='*';
}

for(i=0;i<SCREEN_X;i++)
printf("-");

printf("\nVarianza: %.2f\nMedia: %.2f\nRange: %.2f/%.2f\n",s,m,min_x,max_x);

for(i=0;i<SCREEN_X;i++)
printf("-");

for(j=SCREEN_Y-1;j>=0;j--)
{
printf("\n");
for(i=0;i<SCREEN_X;i++)
printf("%c",table_g[i][j]);
}

printf("\n-[ESC=Exit][+=Zoom in][-=Zoom out]");
for(i=0;i<SCREEN_X-34;i++)
printf("-");
c=getch();
if(c=='+')
{
a/=1.1;
b*=1.1;
}
if(c=='-')
{
a*=1.1;
b/=1.1;
}
} while (c!=0x1B);
}

frizzo28
26-02-2007, 09:07
A meno di errori grossolani:


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

#define SCREEN_X 79
#define SCREEN_Y 19
#define PI 3.14159265359

void main(void)

{
char table_g[SCREEN_X][SCREEN_Y];
float min_x,max_x,step_x,s,m,a=4.,b=1.;
int i,j,c;

printf("Varianza: ");
scanf("%f",&s);

printf("Media: ");
scanf("%f",&m);

do
{
for(i=0;i<SCREEN_X;i++)
{
for(j=0;j<SCREEN_Y;j++)
table_g[i][j]=' ';
}

min_x=m-a*s;
max_x=m+a*s;
step_x=(max_x-min_x)/(SCREEN_X-1);

for(i=0;i<SCREEN_X;i++)
{
/* j=1./(sqrt(2*PI*s))*exp(-pow(min_x+i*step_x-m,2)/(2*s))*SCREEN_Y;*/
j=exp(-pow(min_x+i*step_x-m,2)/(2*s))*SCREEN_Y*b;
if(j<SCREEN_Y)
table_g[i][j]='*';
}

for(i=0;i<SCREEN_X;i++)
printf("-");

printf("\nVarianza: %.2f\nMedia: %.2f\nRange: %.2f/%.2f\n",s,m,min_x,max_x);

for(i=0;i<SCREEN_X;i++)
printf("-");

for(j=SCREEN_Y-1;j>=0;j--)
{
printf("\n");
for(i=0;i<SCREEN_X;i++)
printf("%c",table_g[i][j]);
}

printf("\n-[ESC=Exit][+=Zoom in][-=Zoom out]");
for(i=0;i<SCREEN_X-34;i++)
printf("-");
c=getch();
if(c=='+')
{
a/=1.1;
b*=1.1;
}
if(c=='-')
{
a*=1.1;
b/=1.1;
}
} while (c!=0x1B);
}



Ti ringrazio molto funziona solo che all'umentare della varianza la curva dovrebbe oltre che allargarsi anche appittirsi come altezza...
e al diminuire della varianza dorebbe alzarsi e scringersi invecie si abbassa....
come si potrebbe risolvere?
grazie ciao

reptile9985
26-02-2007, 09:48
Ciao a tutti dovrei realizzare il seguente programma:
"Realizzare un programma che dato in input media e varianza sia in grado di disegnare sul piano cartesiano il grafico di una distribuzione normale";
x calcolare la normale ho scritto la formula e funziona ora il problema è come faccio a fare il grafico dato che il risultato della funzione è sempre un numero tio 0.00457?

la funzione di densità di una normale è la seguente come saprai benissimo
http://upload.wikimedia.org/math/f/f/1/ff1e7f3eca2b0526f0131eae387f324a.png
dove mu è la media e sigma^2 la varianza... per ottenere un grafico devi sostituire alla x valori numerici tra -infinito e +infinito... in generale dato che la distribuzione è compresa per il 99.8% tra mu-3sigma e mu+3sigma non dovrebbero interessare valori esterni... e dato che è simmetrica fa' i calcoli solo tra mu e mu+3sigma e poi "rifletti"
ciao! :)