Upload
detta-conte
View
223
Download
2
Embed Size (px)
Citation preview
Introduzione all’Uso dei Calcolatori (1)Uso dei Calcolatori in Fisica (3)
Prof. Paolo Lotti
Dr. Paolo Lotti Istituto Nazionale di Fisica Nucleare (INFN)Sezione di PadovaVia F. Marzolo, 8I-35131 - Padovatel.: 0498277189stanza 315e-mail: [email protected] http://www.pd.infn.it/~lottiMercoledì ore 15
Laboratori didattici del DipartimentoSig. G. BettellaSig. P. Parisotto
Dr. Matteo MelaniDr. Antonio Ceseracciu
Programma dei corsi Introduzione all’uso dei calcolatori
0) Il calcolatore1) Presentazione dell’aula informatica2) Sistemi operativi presenti3) Il più conosciuto: Microsoft Windows4) Sicurezza?!5) Interazione utente-macchina6) Presentazione di alcuni programmi
Il calcolatore
Memoria RAM (Random Access Memory):è realizzata mediante circuiti integrati, costituiti da un insieme di Flip-Flop (circuiti di memoria a due stati stabili);
Processore Centrale CPU (Central Processing Unit):legge le istruzioni dalla -memoria, le interpreta e le esegue;
Unità di Input e Output:tastiera e mouse, principalmente, sono I dispositivi di INPUT usati dall’utente per trasmettere istruzioni/informazioni al calcolatore;Monitor e stampante sono invece i più comuni dispositivi di OUTPUT.
Sistema Operativo
Il sistema operativo è un programma che costituisce l’interfaccia utente-macchina.
Controlla quindi l’hardware che costituisce la macchina e gestisce l’utilizzo di queste componenti da parte dell’utentemediante opportune istruzioni.
Una differenza importante tra sistemi operativi diversi èquella di permettere l’utilizzo delle risorse del calcolatore da uno o più utenti, ciascuno dei quali eventualmente esegueuna o più istruzioni:
DOS - Windows 95/98 - Windows XP, Linux
Reti di calcolatori
-------- ----
Le apparecchiature per mettere in comunicazione i calcolatori fra loro sono evolute moltissimo nel corso degli ultimi dieci anni
…... ----
Dipartimento di Fisica “G. Galilei”Polo Didattico - Aula Informatica
L’Aula Informatica del Dipartimento di Fisica esistedall’Anno Accademico 1991/92
Hanno contribuito, in forma differente, le seguenti persone:
Prof. E. Calimani Dr. P. Lotti Sig. V. ChiochiaProf. L. Peruzzo Sig. C. Venier Sig. A. Simion Prof. M. Nigro Sig. M. GravinoProf. C. Voci Sig. A. DorigoProf. G. Busetto Sig. M. Menguzzato
Si è iniziato con 10 PC IBM 286
Successivamente, 3-4 MacintoshPC di generazione successiva.1 vecchio microvax digitalalcuni terminali alfanumerici
OGGI
32 postazioni di lavoroPC Pentium III con 256 Mbyte di RAM
Su queste macchine sono installati i sistemi operativiWindows NT 4.0 (tutte) e Linux
(20 macchine) distribuzione RedHat
Il sistema operativo Linux, un sistema Unix per Personal Computers. Il sistema operativo Unix esiste da più di 30 anni ed è considerato tuttora il sistema operativo più ver-satile e potente. La caratteristica più conosciuta di Unix èla non “amichevolezza”.
Esempio: il comando copy si chiama cp!Distingue le maiuscole dalle minuscole: CP non funziona!
Nel corso degli ultimi 10 anni, Unix l’ha vinta costringen-do gli utenti e le imprese prodruttrici di software ad ade-guarsi.
Microsoft per il momento resiste ...
Aula informatica del Dipartimento di Fisica
Sono presenti I due sistemi operativi attualmente più utilizzati, Linux e Microsoft Windows NT, ed in parti-colare Windows NT è un programma di Linux.
Questo software permette la coesistenzadei due sistemi operativi. Ogni calcolatore ospita entrambe I sistemi che convivono,
Vediamo prima a grandi linee I due sistemi e succes-sivamente come I due comunicano tra loro.
Obs: I sistemi sono due ma il calcolatore è uno solo!
Uso di Windows 95/98/me/2000/XP
L’obbiettivo principale è che l’utilizzo sia il più “amichevole”possibile; interfaccia utente-macchina molto intuitiva e mouse.
Clicca qui, clicca lì clicca su, clicca giù
Programmi utili, video scrittura, analisi di dati … tutto al giusto prezzo!
… e se si blocca tutto?
Linux è un sistema operativo gratuito creato da Linus Torvalds e di cui esistono varie distribuzioni, la piùconosciuta oggi è la RedHat
In aula informatica è installata al momento la distri-buzione 6.2 assieme a Windows NT 4.0
Entrambi I sistemi richiedono il possesso di un “account” ovvero una “username” ed una “password”
L’uso di Linux richiede più pazienza in media, mail sistema gestisce meglio le risorse del calcolatore e molto raramente si “blocca”
Aritmetica binaria
L’addizione, la sottrazione, la moltiplicazione e ladivisione tra numeri binari si eseguono esattamente nello stesso modo che nel sistema decimale, con la differenza che il sistema decimale ha dieci cifre mentre quello binario soltanto due, 0 e 1.
Esempi di conversione decimale-binario:
26 ==> 2x10 + 6x1010
I coefficienti delle potenze di 10, base del sistema numericoutilizzato, variano da 0 a 9.Nel sistema binario, da 0 a 1
26 ==> 1x2 + 1x2 +0x2 +1x2 +0x2 ==> 110102
1 0
1 0
1
4 3 2
Consideriamo per esempio l’addizione tra due numeri in codice binario:
26 ==> 11010 e 28 ==>111002 2
11010 + 11100------------- 110110 ==> 54
10
In generale, valgono le seguenti regole:
0 0 1 1+0 +1 +1 1 +1----- ------ ------ ----- 0 1 10 11
Analogamente per la sottrazione:
0 1 1 0-0 -0 -1 -1----- ------ ------ ----- 0 1 0 1 e riporto 1
Esempio:
11100-11010--------------- 00010 ==> 2
10
La moltiplicazione è facile:
0 1 1 0x0 x0 x1 x1
----- ------ ------ ----- 0 0 1 0
Esempio: 11010x11100 -----------------------------
-
00000 00000 11010 11010 11010------------------------------ 1011011000 ==> 728
10
Divisione: si procede come nel sistema decimale conla semplificazione che le cifre nel quoziente possono assumere soltanto il valore 0 o 1
11100:11010=1-11010--------- 00010
28:26=1-26----2
Altro esempio:1001101:101=1111-101
1001 -101
1000 -101
111 -101
10
-------
-------
-------
77:5=15-5 27-25 2
---
----
http://cs.northernc.on.ca/cs/in2254/binarith.htm
Linux è un sistema operativo gratuito creato da Linus Torvalds e di cui esistono varie distribuzioni, la piùconosciuta oggi è la RedHat
In aula informatica è installata al momento la distri-buzione 6.2 assieme a Windows NT 4.0
Entrambi I sistemi richiedono il possesso di un “account” ovvero una “username” ed una “password”
L’uso di Linux richiede più pazienza in media, mail sistema gestisce meglio le risorse del calcolatore e molto raramente si “blocca”
Il sistema operativo permette l’utilizzo del computer in un modo molto più confortabile per l’utente medio le cuiesigenze sono di utilizzare varie applicazioni.
Nell’ambito di un corso di studi scientifico, le applicazionipiù comuni sono:
- programmi per la gestione di documenti;- scrittura di testi, per esempio, relazioni di laboratorio; - analisi di dati di laboratorio;- programmi di grafica;- consultazione di pagine internet;- programmi di manipolazione algebrica:- scrittura di programmi per calcoli numerici.
Una differenza importante tra il sistema operativo Microsoft Windows e Linux:
quando si usa Windows, l’utente interagisce con programmache ne mette a disposizione molti altri;
quando si usa Linux, l’utente interagisce direttamente con il calcolatore e le periferiche a disposizione attraverso un programma molto semplice che è un’emulatore di terminale;
il comando più utile usando un terminale Linux:
# apropos copy (per esempio)# man cp (man, il manuale on-line del sistema)
(in questo caso, #, è il “prompt” che il sistema operativo uti-lizza quando in attesa di un comando)
Dal punto di vista della facilità d’uso, il sistema operativoMicrosoft Windows è molto più pratico, basta “smanettare”un po’ fino a raggiungere l’obbiettivo proposto. esempio
Per quanto riguarda la gestione dei documenti, Microsoft Windows è semplice da usare ed è soddisfacente.
Programmi di scrittura di testi, come Microsoft Word,sono stati adottati come standard per la scittura di librio articoli di giornale (case editrici).
In ambiente scientifico-universitario, per contenere i costie per riuscire a realizzare progetti specifici, per esempio ilcontrollo di apparecchiature di misura, Windows non ser-ve.
Linux ha lo svantaggio di non “presentarsi” molto bene,ma molte applicazioni si sono adeguate, xmgrace, kile. esempio
Un vantaggio molto importante è che esiste una comunitàmolto grande di programmatori molto bravi ma non pro-fessionisti che sviluppa software che vengono messi gratui-tamente a disposizione a livello internazionale (l’installazio-ne non è sempre banale).
Per esempio, in ambito scientifico, a livello di scrittura diarticoli e successivamente di pubblicazione di questi arti-coli in riviste scientifiche, si è manifestata l’esigenza di di-sporre di un linguaggio di scrittura di testi che permettes-se di scrivere le formule matematiche in maniera elegante.
Donald Knuth ha sviluppato un linguaggio di scritturadi testi, TeX, che è diventato lo standard internazionale.In realtà, un’evoluzione di TeX, LaTeX (Leslie Lamport),è stato adottato da tutte le riviste internazionali per la pubblicazione di articoli scientifici (TeX e LaTeX esisto-no ovviamente anche per Microsoft Windows).
Consiglio utile: imparare LaTeX
Per l’analisi dei dati di laboratorio, esistono molte appli-cazioni e la scelta è prof-dependent!
Per la consultazione delle pagine Internet esistono diversiprogrammi (Browser) in circolazione:Internet explorer, Mozilla, Netscape.
Molti siti internet sono ottimizzati per l’uso di uno di que-sti programmi e la scelta viene fatta principalmente per motivi di politica commerciale.
Una risorsa sicuramente molto utile, sono i cosiddetti “mo-tori di ricerca”:
www.google.comwww.altavista.comwww.yahoo.com
Normalmente si procede nel seguente modo: 1) si cerca in internet un sito che metta a disposizione il programma cercato, possibilmente gratuito o di cui esista una versione dimostrativa, valida per un pe- . riodo limitato di tempo (tipicamente un mese);
2) si “scarica” il software e si procede (o se ne richiede) all’installazione;
3) l’obbiettivo è quello di installare nel calcolatore i programmi di maggior utilità;
Il sistema operativo Linux è nato dopo Microsoft Windows e la sfida era quella di inserirsi in un mercato di software con-trollato da Microsoft.
Proprio perchè intenzionato ad inserirsi in un mondo già esi-stente da tempo, la prima preoccupazione di Linux è stata diessere permettere la comunicazione con il mondo Microsoft. Esempio: le applicazioni mtools (mdir, mcopy, mtype, …)che permettono di usare il floppy disk utilizzando una formattazione perfettamente compatibile con Windows.
Ovvio che il floppy disk è una periferica del calcolatore che può essere gestita da Linux senza preoccuparsi di qualsiasicompatibilità con altri sistemi operativi.
Nei calcolatori dell’aula informatica sono stati installati variprogrammi, in entrambe le piattaforme, per tentare di sod-disfare tutte le esigenze didattiche presentate.
In particolare, è stata installata una licenza di Mathematicaprofessional che ne permette l’uso su 10 calcolatori contem-poraneamente.
Un altro programma per Windows NT, gratuito, permette il collegamento ad altri calcolatori in modalità grafica.
Un calcolatore si distingue tra tutti: spiro.fisica.unipd.itspiro accetta collegamenti da altri calcolatori per mezzo diun programma che emula un terminale grafico, ssh, che è molto più evoluto del semplice collegamento via “telnet”.
Quando non si riesce a risolvere un problema algebricamente o mediante un programma di manipulazione algebrica (per vari motivi) e si vuole avere pieno controllo della soluzione in-contrata, si utilizza il calcolo numerico.
Esistono vari trattati “sacri” di calcolo numerico ed l’analisi numerica di un problema si divide in tre tappe fondamentali:
a) identificazione del metodo numerico da applicare;b) scrittura e “debuggaggio” del programma che risolve il problema;c) analisi ed interpretazione dei risultati.
I primi linguaggi di programmazione (compilatori) sviluppati in ambiente scientifico sono stati il Basic, Pascal, ForTran, C, C++.
Linux:
1) la procedura di login da una finestra alfanumerica: CTRL+ALT+F12) cambiare la password: il comando passwd3) gestore di finestre, il file .xinitrc exec wmaker exec AnotherLevel exec startkde4) il comando ls con i suoi parametri, -a per esempio;5) modificare questo file con un editor di testo, pico per esempio6) prima applicazione: pine7) il .forward per reindirizzare la posta elettronica
Windows NT:
1) cambiare password2) collegamento a [email protected] con ssh
Comandi principali:
DOS Linuxdir ls, ls -l, ls -a, ls -altype | more moredel, erase rmmkdir mkdirrmdir rmdirrename mvcopy cphelp man …cd cd
mstools
# mcopy a:\file.ext .
Importante
Tipico esempio del file .forward
[email protected],\lotti
Se si usa, come da me erroneamente detto,
il sistema operativo si accorge dell’errore, loop, e nonspedisce il messaggio!
Un programma per calcolare per punti il valore di una funzione:
/* Funzione per punti */float fun(float x);int main(void){ int ip,ipmin,ipmax,idp; float x,xmin,dx; float y; ipmin=0; ipmax=50; idp=1; xmin=-5.; dx=0.2;
ip=ipmin; while(ip<=ipmax) { x=xmin+dx*ip; y=fun(x); printf("%6.1f %9.5f\n",x,y); ip=ip+idp; }}float fun(float g){ float p=0.; p=-1.+0.5*(g-2.)*(g-2.)+0.1*(g-0.5)*(g-0.5)*(g-0.5); return p;}
# gcc -o fun fun.c# ./fun# ./fun > fig.dat
# export DISPLAY=192.168.1.n:0.0# gnuplotgnuplot> p “fig.dat” u 1:2 w pgnuplot> exit
File grafico (Encapsulated PostScript):
gnuplot> set term postTerminal type set to ‘postscript’Options are ‘landscape noenhanced monocrome …’gnuplot> set output “fig.eps”gnuplot> replotgnuplot> set term X11Options are ‘0’gnuplot>exit
fig.eps
Sviluppo in serie di Taylor
)()0('''6
1)0(''
2
10'0
)()0('''6
1)0(''
2
10'0
)(!
1...))((''
2
1))((')()(
))((!
1)(
432
432
)(2
0
)(
hOhfhf)h(f)f(h)f(
hOhfhf)h(f)f(h)f(
pxfn
pxpfpxpfpfxf
pxpfn
xf
nn
n
nn
considerando p=0 e x=+h, x=-h
sottraendo la seconda equazione dalla prima, si ottiene:
)()0('''62
)()()0(' 4
2
hOfh
h
hfhff
Altre espressioni sono:
)()()0(
)0('
)()0()(
)0('
hOh
hfff
hOh
fhff
Sommando invece queste due equazioni:
2
)()0(2)()0(''
h
hffhff
2
22
2
2
5.0141585.3939479.3
...2
11
2
...)2(2
11
...cos((sin(cos()cos(
xx
xx
xx
xxx
...))((''2
1))((')()(
)cos()(''
)sin()('
)cos()(
2
pxpfpxpfpfxf
xxf
xxf
xxf
Mathcad ...
/* Paolo Lotti 182668 - taylor.c /*#include <stdlib.h>#include <stdio.h>#include <math.h>#define pi 3.141592654 float fun(float x);float fun1(float x1);int main(void){ int ip,ipmin,ipmax,idp; float x,xmin,dx; float x1,x1min,dx1; float y,y1; ipmin=0; ipmax=50; idp=1;
xmin=0.; dx=pi/25.;x1min=pi/2.;dx1=pi/50.; ip=ipmin; while(ip<=ipmax) { x=xmin+dx*ip; y=fun(x); x1=x1min+dx1*ip; y1=fun1(x1); printf("%6.2f %9.5f %6.2f %9.5f\n",x,y,x1,y1); ip=ip+idp; }return 0;}
float fun(float g){ float p=0.; p=cos(g); return p;}float fun1(float g){ float p=0.; p=3.939479-3.141585*g+0.5*g*g; return p;}
www.pd.infn.it -- fisica teorica -- nuclear physics -- P. Lotti
#gcc -o taylor -lm taylor.c#./taylor#./taylor >taylor.dat# export DISPLAY=192.168.1.n (soltanto gli utenti Windows)# gnuplot
gnuplot> p “taylor.dat” u 1:2 w l,”taylor.dat” u 3:4 w p
taylor.eps
Vi presento double
int main(void){ float a; double b; a=1./3.; b=1./3.; printf(" a=%17.15f\n b=%32.30lf\n",a,b); return 0;}
a=0.333333343267441b=0.333333333333333314829616256247
#include <math.h>float fun(float x);int main(void){ float x,h; float xminus,xplus,der1,der2,der,exa; printf(" Enter x:\n"); scanf("%f",&x); printf(" Enter h:\n"); scanf("%f",&h); xplus=x+h; xminus=x-h; der=(fun(xplus)-fun(xminus))/2./h; der1=(fun(xplus)-fun(x))/h; der2=(fun(x)-fun(xminus))/h; exa=cos(x); printf(" h x 2p+ 2p- 3p exact\n"); printf("%10.6f %6.3f %10.6f %10.6f %10.6f %10.6f\n",h,x,der1,der2,der,exa); return 0;}float fun(float g){ float p=0.; p=sin(g); return p;}
#include <math.h>double fun(double x);int main(void){ double x,h; double xminus,xplus,der1,der2,der,exa; printf(" Enter x:\n"); scanf("%lf",&x); printf(" Enter h:\n"); scanf("%lf",&h); xplus=x+h; xminus=x-h; der=(fun(xplus)-fun(xminus))/2./h; der1=(fun(xplus)-fun(x))/h; der2=(fun(x)-fun(xminus))/h; exa=cos(x); printf(" h x 2p+ 2p- 3p exact\n"); printf("%10.6lf %6.3lf %10.6lf %10.6lf %10.6lf %10.6lf\n",h,x,der1,der2,der,exa); return 0;}double fun(double g){ double p=0.; p=sin(g); return p;}
h x 2p+ 2p- 3p exact
float 0.100000 1.000 0.497364 0.581440 0.539402 0.540302 0.010000 1.000 0.536090 0.544494 0.540292 0.540302 0.001000 1.000 0.539958 0.540674 0.540316 0.540302 0.000100 1.000 0.540614 0.540018 0.540316 0.540302 0.000010 1.000 0.542402 0.536442 0.539422 0.540302 0.000001 1.000 0.536442 0.536442 0.536442 0.540302
double 0.100000 1.000 0.497364 0.581441 0.539402 0.540302 0.010000 1.000 0.536086 0.544501 0.540293 0.540302 0.001000 1.000 0.539881 0.540723 0.540302 0.540302 0.000100 1.000 0.540260 0.540344 0.540302 0.540302 0.000010 1.000 0.540298 0.540307 0.540302 0.540302 0.000001 1.000 0.540302 0.540303 0.540302 0.540302
Referenze bibliografiche
Brian W. Kernighan, Dennis M. Ritchie,“Linguaggio C”, Gruppo Editoriale Jackson
Kenneth A. Barclay,“C problem solving and programming”,Prentice Hall International Ltd.
Steven E. Koonin Professor of Theoretical Physics,“Computational physics”, The Benjamin Cummings Publishing Company, Inc.
William H. Press Harvard-Smithsonian Center for Astrophysics,
Brian P. Flannery Exxson Research and Engineering Company,
Saul A. Teukolosky Department of Physics, Cornell Universityand
William T. Vetterling Polaroid Corporation
“Numerical recipes in C”, Cambridge University Press
#gnuplotgnuplot> p “fig.dat” u 1:2 w p,”zero.dat” u 1:2 w l
zero.dat
-8. 0. 6. 0.
fig1.eps
Derive
079154288 23 xxx
54291.2
585831.0
62875.6
3
2
1
x
x
x
Mathcad
...
/* Paolo Lotti 182668 - bisez.c */# include <stdlib.h># include <stdio.h># define tol 0.000001
double fun(double x);
int main(void){ double x,dx,fold,y; int iter; printf(" Enter x,dx:\n"); scanf("%lf,%lf",&x,&dx); fold=fun(x); iter=1; printf(" iter=%2d x=%10.8f y=%10.8f\n",iter,x,fold);
a: x=x+dx; y=fun(x); iter=iter+1; printf(" iter=%2d x=%10.8f y=%10.8f\n",iter,x,y); if(y*fold<0.) { x=x-dx; dx=dx/2.; } if(dx>tol) goto a; return 0;}double fun(double g){ double p; p=8.*g*g*g+28.*g*g-154.*g+79.; return p;}
#gcc -o bisez bisez.c#./bisez Enter x:2.5
Enter x: iter= 1 x=2.50000000 y=-6.00000000 iter= 2 x=2.60000000 y=8.48800000 iter= 3 x=2.55000000 y=1.02100000 iter= 4 x=2.52500000 y=-2.54487500 iter= 5 x=2.55000000 y=1.02100000 iter= 6 x=2.53750000 y=-0.77582812 iter= 7 x=2.55000000 y=1.02100000 iter= 8 x=2.54375000 y=0.11910742 iter= 9 x=2.54062500 y=-0.32922925 iter=10 x=2.54375000 y=0.11910742
iter=11 x=2.54218750 y=-0.10527823 iter=12 x=2.54375000 y=0.11910742 iter=13 x=2.54296875 y=0.00686026 iter=14 x=2.54257812 y=-0.04922257 iter=15 x=2.54296875 y=0.00686026 iter=16 x=2.54277344 y=-0.02118455 iter=17 x=2.54296875 y=0.00686026 iter=18 x=2.54287109 y=-0.00716300 iter=19 x=2.54296875 y=0.00686026 iter=20 x=2.54291992 y=-0.00015158 iter=21 x=2.54296875 y=0.00686026 iter=22 x=2.54294434 y=0.00335428 iter=23 x=2.54293213 y=0.00160134 iter=24 x=2.54292603 y=0.00072487 iter=25 x=2.54292297 y=0.00028664 iter=26 x=2.54292145 y=0.00006753
Si può procedere in un altro modo sfruttando la possibilitàdi ri-direzionare l’output (input) del sistema operativo Unix:
#./bisez < bisez.in >bisez.out
dove il file bisez.in è un file di una sola linea che contiene l’input del programma zero: 2.5, 0.1
l’output del programma viene scritto nel file bisez.out che puòessere successivamente stampato od utilizzato per altri scopi.
fig2.eps
Metodo di Newton--Raphson
Dalla definizione di derivata prima
Si ottiene:
Supponendo che sia uno
‘zero’ della funzione f(x)ii
iii xx
xfxfxf
1
1 )()()('
1ix
)('
)(1
i
iii xf
xfxx
/* Paolo Lotti 182668 - newton.c */# include <stdlib.h># include <stdio.h># define tol 0.000001double fun(double z);double fun1(double z1);int main(void){ double x,x1,diff; int iter; printf(" Enter x:\n"); scanf("%lf",&x); iter=1;a: x1=x-fun(x)/fun1(x); diff=fabs(x-x1); printf(" iter=%2d x=%10.8lf x1=%10.8lf dx=%10.8lf\n", iter,x,x1,diff);
iter=iter+1; x=x1; if(diff>tol) goto a; return 0;}double fun(double g){ double p; p=g*g-5.; return p;}double fun1(double g){ double p; p=2.*g; return p;}
Metodo della secante
Se non si sa come calcolare analiticamente la derivata prima della funzione f(x), si può utilizzare il metodo della secante che calcola numericamente il valore delladerivata prima di f:
1
1)()()('
ii
iii xx
xfxfxf
da cui:
)()()(
1
11
ii
iiiii xfxf
xxxfxx
/* Paolo Lotti 182668 - secante.c */# include <stdlib.h># include <stdio.h># define tol 0.000001double fun(double z);double fun1(double z,double z1);int main(void){ double x,x1,x2,diff; int iter; printf(" Enter x,x1:\n"); scanf("%lf,%lf",&x,&x1); iter=1;a: x2=x-fun(x)/fun1(x,x1); diff=fabs(x-x2); printf(" iter=%2d x=%10.8lf x1=%10.8lf dx=%10.8lf\n", iter,x,x2,diff);
iter=iter+1; x=x1; x1=x2; if(diff>tol) goto a; return 0;}double fun(double g){ double p; p=g*g-5.; return p;}double fun1(double g,double h){ double p; p=(fun(g)-fun(h))/(g-h); return p;}
Newton-Raphson Enter x: 1. iter= 1 x=1.00000000 x1=3.00000000 dx=2.00000000 iter= 2 x=3.00000000 x1=2.33333333 dx=0.66666667 iter= 3 x=2.33333333 x1=2.23809524 dx=0.09523810 iter= 4 x=2.23809524 x1=2.23606890 dx=0.00202634 iter= 5 x=2.23606890 x1=2.23606798 dx=0.00000092
Secante
Enter x,x1:1.,1.3 iter= 1 x=1.00000000 x1=2.73913043 dx=1.73913043 iter= 2 x=1.30000000 x1=2.11948332 dx=0.81948332 iter= 3 x=2.73913043 x1=2.22399676 dx=0.51513367 iter= 4 x=2.11948332 x1=2.23639198 dx=0.11690867 iter= 5 x=2.22399676 x1=2.23606710 dx=0.01207034 iter= 6 x=2.23639198 x1=2.23606798 dx=0.00032401 iter= 7 x=2.23606710 x1=2.23606798 dx=0.00000088
052 x
052 x
Bisezione
Enter x: 1. iter= 1 x=1.00000000 y=-4.00000000 iter= 2 x=1.10000000 y=-3.79000000 iter= 3 x=1.20000000 y=-3.56000000 iter= 4 x=1.30000000 y=-3.31000000 iter= 5 x=1.40000000 y=-3.04000000 iter= 6 x=1.50000000 y=-2.75000000 iter= 7 x=1.60000000 y=-2.44000000 iter= 8 x=1.70000000 y=-2.11000000 iter= 9 x=1.80000000 y=-1.76000000 iter=10 x=1.90000000 y=-1.39000000 iter=11 x=2.00000000 y=-1.00000000 iter=12 x=2.10000000 y=-0.59000000 iter=13 x=2.20000000 y=-0.16000000 iter=14 x=2.30000000 y=0.29000000 iter=15 x=2.25000000 y=0.06250000 iter=16 x=2.22500000 y=-0.04937500 iter=17 x=2.25000000 y=0.06250000
052 x
052 x
iter=18 x=2.23750000 y=0.00640625 iter=19 x=2.23125000 y=-0.02152344 iter=20 x=2.23750000 y=0.00640625 iter=21 x=2.23437500 y=-0.00756836 iter=22 x=2.23750000 y=0.00640625 iter=23 x=2.23593750 y=-0.00058350 iter=24 x=2.23750000 y=0.00640625 iter=25 x=2.23671875 y=0.00291077 iter=26 x=2.23632813 y=0.00116348 iter=27 x=2.23613281 y=0.00028996 iter=28 x=2.23603516 y=-0.00014678 iter=29 x=2.23613281 y=0.00028996 iter=30 x=2.23608398 y=0.00007159 iter=31 x=2.23605957 y=-0.00003760 iter=32 x=2.23608398 y=0.00007159 iter=33 x=2.23607178 y=0.00001699 iter=34 x=2.23606567 y=-0.00001030 iter=35 x=2.23607178 y=0.00001699 iter=36 x=2.23606873 y=0.00000335 iter=37 x=2.23606720 y=-0.00000348 iter=38 x=2.23606873 y=0.00000335
Calcolo di un integrale definito - quadratura
b
hb
ha
ha
ha
a
b
a
dxxfdxxfdxxfdxxf2
4
2
2
)(...)()()(
In particolare sarà sufficiente sapere come calcolare
h
h
dxxf )(
approssimando la funzione )(xf mediante un’espressione
che possa essere integrata esattamente in questo intervallo.
Introducendo un numero pari di intervalli nell’intervallodi integrazione [a,b] di larghezza h, l’integrale può essere riscritto nella forma seguente:
Definiamo, per alleggerire il formalismo,
0
1
1
)0(
)(
)(
ff
fhf
fhf
Il caso più semplice, regola dei trapezi, è quello di approssimare linearmente la funzione consideratanell’intervallo -h,0 e 0,+h:
)()(
)()()(
2010
2101
hOxh
fffxf
hOhxh
fffxf
rispettivamente. Conseguentemente:
)()2(2
)( 3101 hOfff
hdxxf
h
h
Un’approssimazione migliore si ottiene considerandol’espanzione in serie di Taylor all’ordine successivo:
)(2
2)( 32
210111
0 xOxh
fffx
h
fffxf
da cui:
)()4(3
)( 5101 hOfff
hdxxf
h
h
Osserviamo che la precisione di questa espressione èmigliore di quanto atteso dal momento che il terminesuccessivo a quello considerato nello sviluppo in serie di Taylor non contribuisce al calcolo dell’integrale.
Utilizzando queste espressioni si ottengono rispettivamentele espressioni complete per la regola dei trapezi e quella di Simpson:
...)2(2)(2)((2
)( hafhafafh
dxxfb
a
))()(2 bfhbf e
)2(2)(4)((3
)( hafhafafh
dxxfb
a
))()(4...)3(4 bfhbfhaf
# include <stdlib.h># include <stdio.h>main(){ int i,num[5]; for(i=1; i<=5; i=i++) num[i]=i*i; for(i=0; i<=5; i=i++) printf(" num[%2d]=%3d\n",i,num[i]);}
num[ 0]=-1073752240 num[ 1]= 1 num[ 2]= 4 num[ 3]= 9 num[ 4]= 16 num[ 5]= 25
Array (vettore)
/* Paolo Lotti 182668 - trape.c */# include <stdlib.h># include <stdio.h># include <math.h>double fun(double z);int main(void){ double a,b,x,dx,integ,exa; int N,N1,i,coef[1000],rest; printf(" Enter a,b:\n"); scanf("%lf,%lf",&a,&b); exa=fun(b)-fun(a);
a: printf(" Enter N:\n"); scanf("%d",&N); rest=N%2; if(rest!=0) { printf("N must be an even number!\n"); goto a; } dx=(b-a)/N; printf("h=%lf\n\n",dx); N1=N+1; coef[1]=1; coef[N1]=coef[1]; for(i=2; i<=N; i=i+1) { coef[i]=2; }
integ=0.; for(i=1; i<=N1; i=i+1) { printf(" coef[%2d]=%1d\n",i,coef[i]); x=a+(i-1)*dx; integ=integ+coef[i]*fun(x); } integ=integ*dx/2.; printf("\n integ= %lf exact= %lf\n",integ,exa); return 0;}double fun(double g){ double p; p=exp(g); return p;}
/* Paolo Lotti 182668 - simp.c */# include <stdlib.h># include <stdio.h># include <math.h>double fun(double z);int main(void){ double a,b,x,dx,integ,exa; int N,N1,i,ifac,coef[1000],rest; printf(" Enter a,b:\n"); scanf("%lf,%lf",&a,&b); exa=fun(b)-fun(a);
a: printf(" Enter N:\n"); scanf("%d",&N); rest=N%2; if(rest!=0) { printf("N must be an even number!\n"); goto a; } dx=(b-a)/N; printf("h=%lf\n",dx); N1=N+1; coef[1]=1; coef[N1]=coef[1];
ifac=2; for(i=2; i<=N; i=i+1) { ifac=6-ifac; coef[i]=ifac; } integ=0.; for(i=1; i<=N1; i=i+1) { printf(" coef[%2d]=%1d\n",i,coef[i]); x=a+(i-1)*dx; integ=integ+coef[i]*fun(x); }integ=integ*dx/3.; printf("\n integ= %lf exact= %lf\n",integ,exa); return 0; }
double fun(double g){ double p; p=exp(g); return p;}
N h trape simpson
4 0.25 1.727222 1.718319 10 0.10 1.719713 1.718283 20 0.05 1.718640 1.718282 50 0.02 1.718339 1.718282100 0.01 1.718296 1.718282
718282.111
0
edxex
N h trape simpson
4 0.75 19.971895 19.116965 10 0.30 19.228464 19.086387 20 0.15 19.121309 19.085590 50 0.06 19.091262 19.085538 100 0.03 19.086968 19.085537
085537.1913
0
3 edxex
Funzioni il cui argomento è di tipo double e restituiscono un numero anch’esso di tipo double:
acos(x) funzione trigonometrica inversa del coseno di x; il risultato è espresso in radianti ed è compreso tra 0 e
asin(x) funzione trigonometrica inversa del seno di x; il risultato è espresso in radianti ed è compreso tra
atan(x) funzione trigonometrica inversa della tangente di x; il risultato è espresso in radianti ed è compreso tra
cos(x) funzione trigonometrica che calcola il coseno di x, espresso in radianti
cosh(x) coseno iperbolico di x
2
2
,
2
2
,
exp(x) funzione esponenziale di x
log(x) logaritmo naturale di x
log10(x) logaritmo in base 10 di x
sin(x) funzione trigonometrica che calcola il seno di x espresso in radianti
sinh(x) seno iperbolico di x
sqrt(x) funzione radice quadrata di x
tan(x) funzione trigonometrica che calcola la tangente di x espresso in radianti
tanh(x) tangente iperbolica di x