30
Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Embed Size (px)

Citation preview

Page 1: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Numerical Recipes

The Art of Scientific Computing (with some applications in

computational physics)

Page 2: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Computer Architecture

CPU Memory

External Storage

Page 3: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Program Organization

int main() {

}

double func(double x) {

}

Page 4: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

First Example

#include <stdio.h>

main()

{

printf(“hello, world\n”);

}

gcc hello.c (to get a.out) [Or other way depending on your OS]

Page 5: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Data Types

#include <stdio.h>

main() {

int i,j,k;

double a,b,f;

char c, str[100];

j = 3; a = 1.05; c = ‘a’;

str[0] = ‘p’; str[1] = ‘c’;

str[2] = ‘\0’;

printf(“j=%d, a=%10.6f, c=%c, str=%s\n”, j, a, c, str);

}

Page 6: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Equal is not equal

• x = 10 is not 10 = x

• x = x + 1 made no sense if it is math

• x = a + b OK, but a+b = x is not C.

• In general, left side of = refers to memory location, right side can be evaluated to numerical values

Page 7: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Expressions

• Expressions can be formed with +, -, *, / with the usual meaning

• Use parenthesis ( …) if meaning is not clear, e.g., (a+b)*c

• Be careful 2/3 is 0, not 0.666….

• Other large class of operators exists in C, such as ++i, --j, a+=b, &, !, &&, ||, ^, ?a:b, etc

Page 8: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Use a Clear Stylek=(2-j)*(1+3*j)/2;

k=j+1;

if(k == 3) k=0;

switch(j) {

case 0: k=1; break;

case 1: k=2; break;

case 2: k=0; break;

default: {

fprintf(stderr, “unexpected value for j”);

exit(1);

}

}

(A)

(B)

(C)

(D) k=(j+1)%3;

Page 9: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Control Structures in C - loopfor (j=0; j < 10; ++j) {

a[j] = j;

}

while (n < 1000) {

n *= 2;

}

do {

n *= 2;

} while (n < 1000);

Page 10: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Control Structure - conditional

if (b > 3) {

a = 1;

}

if (n < 1000) {

n *= 2;

} else {

n = 0;

}

Page 11: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Control Structure - break

for( ; ; ) {

...

if(. . .) break;

}

Page 12: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Pointers

• Pointer is a variable in C that stores address of certain type

• Int *p; double *ap; char *str;• You make it pointing to something by (1)

address operator &, e.g. p = &j, (2) malloc() function, (3) or assignment, str = “abcd”.

• Use the value the pointer is pointing to by dereferencing, *p

Page 13: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

1D Array in C

• int a[4];

defines elements a[0],a[1],a[2], and a[3]

• a[j] is same as *(a+j), a has a pointer value

• float b[4], *bb; bb=b-1; then valid range of index for b is from 0 to 3, but bb is 1 to 4.

Page 14: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

1D Array Argument Passing

void routine(float bb[], int n)

// bb[1..n] (range is 1 to n)

• We can use as

float a[4];

routine(a-1, 4);

Page 15: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

2D Array in C

int m[13][4]; defines fixed size array. Example below defines dynamic 2D array. float **a;

a = (float **) malloc(13*sizeof(float *));

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

a[i] = (float *)malloc(4*sizeof(float));

}

Page 16: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Representation of 2D Array

Page 17: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Special Treatment of Array in NR

• float *vector(long nl, long nh)

allocate a float vector with index [nl..nh]

• float **matrix(long nrl, long nrh, long ncl, long nch)

allocate a 2D matrix with range [nrl..nrh] by [ncl..nch]

Page 18: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Header File in NR

#include “nr.h”

#include “nrutil.h”

Page 19: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Precedence and Association

Page 20: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Pre/post Increment, Address of

• Consider f(++i) vs f(i++), what is the difference?

• &a vs *a

• Conditional expression

x = (a < b) ? c : d;

Page 21: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Macros in C

#define DEBUG

#define PI 3.141592653

#define SQR(x) ((x)*(x))

Page 22: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Computer Representation of Numbers

• Unsigned or two’s complement integers (e.g., char)

0000 0000 = 0

0000 0001 = 1

0000 0010 = 2

0000 0011 = 3

0000 0100 = 4

0000 0101 = 5

0000 0110 = 6

. . .

0111 1111 = 127

1000 0000 = 128 or -128

1000 0001 = 129 or -127

1000 0010 = 130 or -126

1000 0011 = 131 or -125

. . .

1111 1100 = 252 or -4

1111 1101 = 253 or -3

1111 1110 = 254 or -2

1111 1111 = 255 or -1

Page 23: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Real Numbers on Computer

0 0.5 1 2 3 4 5 6 7

ε

1 ( 1)0 1 1

min max0 ,

p ep

i

d d d

d e e e

Example for β=2, p=3, emin= -1, emax=2

ε is called machine epsilon.

Page 24: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Floating Point, sMBe-E, not IEEE

Page 25: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

IEEE 754 Standard (32-bit)

• The bit pattern

represents

If e = 0: (-1)s f 2-126

If 0<e<255: (-1)s (1+f) 2e-127

If e=255 and f = 0: +∞ or -∞

and f ≠ 0: NaN

… …se

f = b-12-1 + b-22-2 + … + b-232-23

b-1 b-2b-23

Page 26: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Error in Numerical Computation

• Integer overflow

• Round off error– E.g., adding a big number with a small

number, subtracting two nearby numbers, etc– How does round off error accumulate?

• Truncation error (i.e. discretization error)– The field of numerical analysis is to control

truncation error

Page 27: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

(Machine) Accuracy

• Limited range for integers (char, int, long int, and long long int)

• Limited precision in floating point. We define machine ε as such that the next representable floating point number is (1 + ε) after 1.ε 10-7 for float (32-bit) and

10-15 for double (64-bit)

Page 28: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Stability

• An example of computing Φn where

• We can compute either by Φn+1 = Φn Φ

or Φn+1 = Φn-1 – Φn

Results are shown in a simple program

5 10.61803398

2

Page 29: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Reading Materials

• “Numerical Recipes”, Chap 1.

• “What every computer scientist should know about floating-point arithmetic”. Can be downloaded from

http://www.validlab.com/goldberg/paper.ps

• “The C Programming Language”, Kernighan & Ritchie

Page 30: Numerical Recipes The Art of Scientific Computing (with some applications in computational physics)

Problems for Lecture 1 (C programming, representation of numbers in computer, error, accuracy and stability, assignment to be handed in next week)

1. (a) An array is declared as char *s[4] = {“this”, “that”, “we”, “!”};What is the value of s[0][0], s[0][4], and s[2][1]? (b) If the array is to be passed to a function, how should it be used, i.e., the declaration of the function and use of the function in calling program? If the array is declared aschar t[4][5] ;instead, then how should it be passed to a function?

2. (a) Study the IEEE 754 standard floating point representation for 32-bit single precision numbers (float in C) and write out the bit-pattern for the float numbers 0.0, 1.0, 0.1, and 1/3.

(b) For the single precision floating point representation (32-bit number), what is the precise value of machine epsilon? What is the smallest possible number and largest possible number?

3. For the recursion relation: F n+1 =Fn-1 – Fn

with F0 and F1 arbitrary, find the general solution Fn. Based on its solution, discuss why is it unstable for computing the power of golden mean Φ? (Hint: consider solution of the form Fn = Arn ).