introduccion a c++ y fortran 90/95 · pdf filea = pi * r**2 c escribir area en el terminal...
TRANSCRIPT
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
Fisica Computacional - CC063
Declaracion de variables para C/C++ y Fortran 90/95Declaracion de variables para C/C++ y Fortran 90/95
2
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)
Fisica Computacional - CC063
Elementos de sintaxis de programacionElementos de sintaxis de programacion
4
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
}
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
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
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
}
}
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
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);
}
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
}
}
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
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
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";
}
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
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";}
}
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)
Fisica Computacional - CC063
exp(-x)
18
Solucion:
1- calculando
2- usando relacion de recursion para
donde
3- primero calculando
y despues tomando la inversa
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()
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()
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()
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()
Fisica Computacional - CC063
Operadores en C/C++
23
++x; equivale a x = x+1;
--x; equivale a x = x-1;
A = expresion1 ? expresion2 : expresion3;
Fisica Computacional - CC063
Operadores en C/C++
24