Sie sind auf Seite 1von 24

Universidad Nacional de Ingeniera

Facultad de Ciencias

Fsica Computacional
CC063

Introduccion a
C++ y Fortran 90/95
Prof: J. Solano
2012-I
Fisica Computacional - CC063

Declaracion de variables para C/C++ y Fortran 90/95

Fisica Computacional - CC063

Tipos de variables

Locales (Definido dentro de una funcin, slo est disponible dentro del alcance de
la funcin)
Formales (Si se define dentro de una funcin, slo est disponible dentro de esa
funcin especfica)
Globales (Definido fuera de una funcin dada, disponible para todas las funciones
desde el punto donde se define)

Fisica Computacional - CC063

Elementos de sintaxis de programacion

Fisica Computacional - CC063

Calculo del area del circulo (p1-area.c)


// p1-area.c: Area del circulo
#include <stdio.h>
#define PI 3.1415926535897932385E0
main() {
double radio, area;

// declarar variables

printf("dar el radio de un circulo \n");

// preguntar por el radio

scanf("%lf", &radio);

// leer el radio

area = radio * radio * PI;

// formula del area

printf("radio=%f, area=%f\n", radio, area); // imprimir resultados


}

Fisica Computacional - CC063

Calculo del area del circulo (p1-area.f)


c p1-area.f: Area del circulo, r entrada desde el terminal
c
Program p1-area
Double Precision pi, r, A
c

Mejor valor de pi para punto flotante IEEE


pi = 3.1415926535897932385E0

leer r de entrada estandar (terminal)


Write(*,*) 'Entre el radio de un circulo'
Read (*,*) r

calcular el area
A = pi * r**2

escribir area en el terminal monitor


Write(*, 10) 'radio r = ', r, 'area = ', A

10

Format(a10, f10.5, a10, f12.5)


Stop 'area'
End

Fisica Computacional - CC063

Compilacion en el shell
Compilar en el shell (bash) asi:
gcc -o p1-area p1-area.c
f77 -o p1-area p1-area.f

Fisica Computacional - CC063

Limites under-overflow (p2-under-over.c)


/* Curso Fisica Computacional - CC063
2012-I

CC-FC-UNI */

// p2-under-over.c: Determina limites de overflow y underflow


#include <stdio.h>
#define N 1024

// puede que no sea suficientemente grande para causar


// over y underflow

main() {
double under = 1., over = 1.;

// valores de inicio

int i
for (i=0; i<N; i++) {
under /= 2.;

// dividir entre dos

over *= 2.;

// multiplicar por dos

printf("%d . under: %e over:%e \n", i+1, under, over); // imprimir resultados


}
}

Fisica Computacional - CC063

Limites under-overflow (p2-under-over2.c)

En lugar de imprimir los resultados en el


monitor, guardarlos en un archivo de datos

Fisica Computacional - CC063

Limites under-overflow (p2-under-over2.c)


/* Curso Fisica Computacional - CC063
2012-I

CC-FC-UNI */

// p2-under-over2.c: Determina limites de overflow y underflow


#include <stdio.h>
#define N 1024

// puede que no sea suficientemente grande para causar


// over y underflow

main() {
double under = 1., over = 1.;

// valores de inicio

int i;
FILE *output;

// salvar datos en p2-under-over.dat

output= fopen("p2-under-over2.dat","w");
for (i=0; i<N; i++) {
under /= 2.;

// dividir entre dos

over *= 2.;

// multiplicar por dos

fprintf(output, "%d . under: %e over:%e \n", i+1, under, over); // guardar resultados
}
printf("datos almacenados en p2-under-over2.dat.\n");
fclose(output);
}

Fisica Computacional - CC063

10

Precision de la maquina (p3-limit.c)


/* Curso Fisica Computacional - CC063
2012-I

CC-FC-UNI */

// p3-limit.c: Determina precision de la maquina, el menor e para 1+e != 1


#include <stdio.h>
#define N 60
main() {
double eps = 1., uno;

// valores iniciales

int i;
for (i=0; i<N; i++) {
eps /= 2.;

// dividir entre dos

uno = 1.0+eps;
printf("%.18f \t %.16e \n", uno, eps);

// imprimir resultados

}
}
Fisica Computacional - CC063

11

Precision de la maquina (p3-limit.c)

En lugar de imprimir los resultados en el


monitor, guardarlos en un archivo de datos

Fisica Computacional - CC063

12

Precision de la maquina (p3-limit.c)

Otro metodo: usar el shell de linux (bash)


> ./p3-limit > p3-limit-sh.dat

Fisica Computacional - CC063

13

Raices ec cuadratica (p4-raizquadr.cc)

// p4-raizqadr.cc : Raices de una ecuacion cuadratica a*x**2 + b*x + c = 0


#include <iostream>
#include <cmath>
using namespace std;
int main() {
float a, b, c, x1, x2, s, d, signb;

// declaracion de variables

cout << "Ingrese a, b, y c: ";

// obtener a, b y c

cin >> a >> b >> c;


d = b*b - 4*a*c;
signb = 1;
if ((b<0) && (d>0))
signb = -1;
s = -(b + sqrt(d)*signb)/2;
x1 = s/a;
x2 = c/s;
cout << "Las raices son \n" << x1 << " y " << x2 << "\n";
if ((b<0) && (d<0))
signb = -1;
s = -(sqrt(-d)*signb)/(2*a);
x1 = -b/(2*a);
x2 = -b/(2*a);
cout << "Las raices son \n" << x1 << " + " << s/a << "I y " << x2 << " - " << s/a << "i \n";
}

Fisica Computacional - CC063

14

Raices ec cuadratica (p4-raizquadr.cc)

Compilar en el shell (bash):


> g++ -o p4-raizquadr p4-raizquadr.cc
Corregir los errores y mejorar la solucion

Fisica Computacional - CC063

15

Raices ec cuadratica (p4-raizquadr2.cc)


// Raices de una ecuacion cuadratica a*x**2 + b*x + c = 0
// p4-raizquadr2.cc

(x-x1)*(x-x2) = 0

#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a, b, c, x1, x2, s1, s2, d;

// declaracion de variables

cout << "Ingrese a, b, y c: ";

// obtener a, b y c

cin >> a >> b >> c;


d = b*b - 4*a*c;
if (d>0) {
s1 = -(b + sqrt(d))/2;
s1 = -(b - sqrt(d))/2;
x1 = s1/(2*a);
x2 = s2/(2*a);
cout << "Las raices son \n" << x1 << " y " << x2 << "\n";}
else{
s1 = sqrt(-d)/(2*a);
x1 = -b/(2*a);
cout << "Las raices son \n" << x1 << " + " << s1 << "i y " << x1 << " - " << s1 << "i \n";}
}

Fisica Computacional - CC063

16

Numeros reales y precision numerica


Overflow
Underflow
Errores de redondeo/roundoff
(ej:0.1234567890123456789 x 101)
Perdida de precision (ej: 1+10-8)
Singularidades (ej: sin(x)/x cuando x->0)
Fisica Computacional - CC063

17

exp(-x)
Solucion:
1- calculando

2- usando relacion de recursion para

donde

3- primero calculando

y despues tomando la inversa

Fisica Computacional - CC063

18

exp(-x) : algoritmo de fuerza bruta

/* Programa para calcular funcion exp(-x) = S(n=0->inf) (-1)^n x^n/n! */


#include <iostream>
#include <cmath>
using namespace std;
#define TYPE

double

// type float (double): 32 (64) bits de precision

#define TRUNCATION 1.0E-10


TYPE factorial(int);

// declaracion de funcion

int main() {
int n;

// declaracion de variables

TYPE x, term, sum;


for(x=0.0; x < 100.0; x += 1.0) {
sum = 0.0;

// inicializacion

n = 0;
term = 1;
while(fabs(term) > TRUNCATION) {
term = pow( -1, (TYPE) n) * (TYPE) pow((TYPE) x, (TYPE) n)/ factorial(n);
sum += term;
n++;
} // final del loop while()
cout << " x = " << x << " exp = " << exp(-x) << " serie = " << sum;
cout << " numero de terminos " << n << endl;
}

// final del loop for()

return 0;
}

// final funcion main()

Fisica Computacional - CC063

19

exp(-x) : algoritmo de fuerza bruta


/* Programa para calcular funcion factorial n! */
TYPE factorial(int n);
{
int loop;

// declaracion de variables

TYPE fac;
for(loop=1; fac = 1.0; loop <= n; loop++) {
fac *= loop;
}
return fac;
}

// final funcion factorial()

Fisica Computacional - CC063

20

exp(-x) : algoritmo sin factoriales


/* Programa para calcular funcion exp(-x) = S(n=0->inf) s_n donde s-n = s_n-1 *x/n */
#include <iostream>
#include <cmath>
using namespace std;
#define TRUNCATION 1.0E-10
int main() {
int loop, n;

// declaracion de variables

double x, term, sum;


for(loop=0; loop < 100; loop += 1) {
x = (double) loop;
sum = 1.0;

// inicializacion

n = 1;
term = 1;
while(fabs(term) > TRUNCATION) {
term *= -x/((double) n);
sum += term;
n++;
} // final del loop while()
cout << " x = " << x << " exp = " << exp(-x) << " serie = " << sum;
cout << " numero de terminos " << n << endl;
}
}

// final del loop for()


// final funcion main()

Fisica Computacional - CC063

21

Desviacion standard

// valor medio y la desviacion standard de un conj de datos almacenado en un array x[ ]


#include <iostream>
#include <cmath>
using namespace std;
int main() {
float sum, sumsq2, xbar, sigma1, sigma2;

// declaracion de variables

int i;
for(i=0 ; i < 127 ; i++){
x[i] = i + 100000.;
}
sum = 0.;

// la variable sum es la suma sobre todos los elementos

sumsq2 = 0.; // la variable sumsq2 es la suma sobre x^2


for ( i=0 ; i < 127 ; i++) {

// Now we use the text book algorithm

sum += x[i];
sumsq2 += pow( (double) x[i] , 2.); }
// calculo del promedio y del sigma
xbar = sum/127.;
sigma1 = sqrt((sumsq2 - sum*xbar)/126.);
/* calculamos el promedio y luego la suma de la desv. standard */
sumsq2 = 0.;
for ( i=0 ; i < 127 ; i++) {
sumsq2 += pow ( (double) (x[i]-xbar), 2.);
}
sigma2 = sqrt(sumsq2/126.);
cout << "xbar=" << xbar << " sigma1=" << sigma1 << " sigma2=" << sigma2 << endl;
return 0;
} // final funcion main()

Fisica Computacional - CC063

22

Operadores en C/C++
++x; equivale a x = x+1;
--x;

equivale a x = x-1;

A = expresion1 ? expresion2 : expresion3;

Fisica Computacional - CC063

23

Operadores en C/C++

Fisica Computacional - CC063

24

Das könnte Ihnen auch gefallen