introduccion a c++ y fortran 90/95 · pdf filea = pi * r**2 c escribir area en el terminal...

24
Fisica Computacional - CC063 Introduccion a Introduccion a C++ y Fortran 90/95 C++ y Fortran 90/95 Prof: J. Solano 2012-I Universidad Nacional de Ingeniería Facultad de Ciencias Física Computacional CC063

Upload: doanquynh

Post on 15-Mar-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Introduccion a Introduccion a C++ y Fortran 90/95C++ y Fortran 90/95

Prof: J. Solano2012-I

Universidad Nacional de IngenieríaFacultad de Ciencias

Física ComputacionalCC063

Page 2: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

2

Page 3: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Tipos de variablesTipos de variables

3

Locales (Definido dentro de una función, sólo está disponible dentro del alcance de la función)

Formales (Si se define dentro de una función, sólo está disponible dentro de esa función específica)

Globales (Definido fuera de una función dada, disponible para todas las funciones desde el punto donde se define)

Page 4: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Elementos de sintaxis de programacionElementos de sintaxis de programacion

4

Page 5: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

5

// 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

}

Page 6: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

6

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

c leer r de entrada estandar (terminal)

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

Read (*,*) r

c calcular el area

A = pi * r**2

c escribir area en el terminal monitor

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

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

Stop 'area'

End

Page 7: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Compilacion en el shellCompilacion en el shell

7

Compilar en el shell (bash) asi:

gcc -o p1-area p1-area.c

f77 -o p1-area p1-area.f

Page 8: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

8

/* 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

}

}

Page 9: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

9

En lugar de imprimir los resultados en el monitor, guardarlos en un archivo de datos

Page 10: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

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

10

/* 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);

}

Page 11: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Precision de la maquina (p3-limit.c)Precision de la maquina (p3-limit.c)

11

/* 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

}

}

Page 12: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Precision de la maquina (p3-limit.c)Precision de la maquina (p3-limit.c)

12

En lugar de imprimir los resultados en el monitor, guardarlos en un archivo de datos

Page 13: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Precision de la maquina (p3-limit.c)Precision de la maquina (p3-limit.c)

13

Otro metodo: usar el shell de linux (bash)

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

Page 14: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Raices ec cuadratica (p4-raizquadr.cc)Raices ec cuadratica (p4-raizquadr.cc)

14

// 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";

}

Page 15: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Raices ec cuadratica (p4-raizquadr.cc)Raices ec cuadratica (p4-raizquadr.cc)

15

Compilar en el shell (bash):

> g++ -o p4-raizquadr p4-raizquadr.cc

Corregir los errores y mejorar la solucion

Page 16: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Raices ec cuadratica (p4-raizquadr2.cc)Raices ec cuadratica (p4-raizquadr2.cc)

16

// 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";}

}

Page 17: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Numeros reales y precision numericaNumeros reales y precision numerica

17

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)

Page 18: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

exp(-x)

18

Solucion:

1- calculando

2- usando relacion de recursion para

donde

3- primero calculando

y despues tomando la inversa

Page 19: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

exp(-x) : algoritmo de fuerza brutaexp(-x) : algoritmo de fuerza bruta

19

/* 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()

Page 20: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

exp(-x) : algoritmo de fuerza brutaexp(-x) : algoritmo de fuerza bruta

20

/* 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()

Page 21: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

exp(-x) : algoritmo sin factorialesexp(-x) : algoritmo sin factoriales

21

/* 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()

Page 22: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Desviacion standard

22

// 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()

Page 23: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Operadores en C/C++

23

++x; equivale a x = x+1;

--x; equivale a x = x-1;

A = expresion1 ? expresion2 : expresion3;

Page 24: Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal monitor Write(*, 10) 'radio r = ', r ... Determina limites de overflow y underflow #include

Fisica Computacional - CC063

Operadores en C/C++

24