Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal...
Transcript of Introduccion a C++ y Fortran 90/95 · PDF fileA = pi * r**2 c escribir area en el terminal...
![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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/1.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/2.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/3.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/4.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/5.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/6.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/7.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/8.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/9.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/10.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/11.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/12.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/13.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/14.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/15.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/16.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/17.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/18.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/19.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/20.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/21.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/22.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/23.jpg)
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](https://reader031.fdocuments.us/reader031/viewer/2022022501/5aa9e6a37f8b9a77188d7423/html5/thumbnails/24.jpg)
Fisica Computacional - CC063
Operadores en C/C++
24