Lezione del 12/5/2014

Uso dei blocchi in Ruby

File blocchi.rb

 1#!/usr/bin/env ruby
 2#-------------------------------------------------------------------------#
 3#  Esercitazioni in Laboratorio per il Corso di                           #
 4#  Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014             #
 5#                                                                         #
 6#  Autori:   Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort          #
 7#            Dipartimento di Ingeneria Industriale, Universita` di Trento #
 8#  Sito web: http://www.ing.unitn.it/~bertolaz/                           #
 9#                                                                         #
10#  Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it          #
11#                                                                         #
12#  Copyright (c) 2014 E.Bertolazzi e C.M. Giorgio Bort                    #
13#-------------------------------------------------------------------------#
14
15#ary = [11,22,33,44,55]
16#ary.each do |el|
17#  puts el
18#end
19#
20#ary.each{|el| puts el }
21
22class Array
23  def ogni() # each
24    puts "2. Entrato nella funzione ogni"
25    for i in 0...self.size
26      puts "3. Inizio chiamata blocco"
27      yield(self[i])
28      yield(i)
29      puts "4. Fine chiamata blocco"
30    end
31    puts "5. Uscita dalla funzione ogni"
32  end
33  
34  def ogni_con_indice() # each_with_index
35    for i in 0...self.size
36      yield(self[i], i)
37    end
38  end
39end
40
41module ValutaOperazioni
42  def self.sqrt(x)
43    return Math::sqrt(x)
44  end
45  
46  def self.pow2(x)
47    return x*x
48  end
49end
50
51
52
53module StampaOperazioni
54  def self.sqrt(x)
55    puts Math::sqrt(x)
56  end
57  
58  def self.pow2(x)
59    puts x*x
60  end
61end
62
63
64
65bary = ['11','22','33','44']
66#puts "1. Definito array bary"
67#bary.ogni do |el|
68#  puts el
69#end
70#puts "6. Uscita dal programma"
71bary.ogni_con_indice do |el, indx|
72  res = StampaOperazioni::pow2( el.to_f )
73  puts "#{el} -> #{res.inspect}"
74end

Integrazione col metodo dei trapezi (versione senza blocchi)

File trapezi_semplice.rb

 1#!/usr/bin/env ruby
 2#-------------------------------------------------------------------------#
 3#  Esercitazioni in Laboratorio per il Corso di                           #
 4#  Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014             #
 5#                                                                         #
 6#  Autori:   Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort          #
 7#            Dipartimento di Ingeneria Industriale, Universita` di Trento #
 8#  Sito web: http://www.ing.unitn.it/~bertolaz/                           #
 9#                                                                         #
10#  Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it          #
11#                                                                         #
12#  Copyright (c) 2014 E.Bertolazzi e C.M. Giorgio Bort                    #
13#-------------------------------------------------------------------------#
14
15#
16# Esempio di integrazione numerica,
17# uso della formula dei trapezi per integrare
18# x*sin(x) nell'intervallo [1,10]
19#
20
21def f(x)
22  return x*Math::sin(x)
23end
24
25#
26# Metodo dei trapezi
27# a = estremo sinistro intervallo di integrazione
28# b = estremo destro intervallo di integrazione
29# n = numero di intervalli
30# 
31def trapezi( a, b, n )
32  h   = (b.to_f-a.to_f)/n.to_f
33  res = (f(a)+f(b))/2
34  for i in 1...n do
35    xi = a+i*h # calcolo nodo di quadratura interno
36    res += f(xi) ;
37  end
38  return res*h
39end
40
41# integrale esatto calcolato "a mano"
42esatto = Math::sin(10)-10*Math::cos(10)
43
44a = 0
45b = 10
46
47n = 10
48trap = trapezi(a,b,n)
49puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
50
51n = 20
52trap = trapezi(a,b,n)
53puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
54
55n = 40
56trap = trapezi(a,b,n)
57puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
58
59n = 80
60trap = trapezi(a,b,n)
61puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
62
63n = 160
64trap = trapezi(a,b,n)
65puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"

Integrazione col metodo dei trapezi (versione CON i blocchi)

File trapezi_con_blocchi.rb

 1#!/usr/bin/env ruby
 2#-------------------------------------------------------------------------#
 3#  Esercitazioni in Laboratorio per il Corso di                           #
 4#  Fondamenti di Informatica e Calcolo Numerico, AA 2013/2014             #
 5#                                                                         #
 6#  Autori:   Enrico Bertolazzi e Carlos Maximiliano Giorgio Bort          #
 7#            Dipartimento di Ingeneria Industriale, Universita` di Trento #
 8#  Sito web: http://www.ing.unitn.it/~bertolaz/                           #
 9#                                                                         #
10#  Contatti: enrico.bertolazzi@unitn.it, cm.giorgiobort@unitn.it          #
11#                                                                         #
12#  Copyright (c) 2014 E.Bertolazzi e C.M. Giorgio Bort                    #
13#-------------------------------------------------------------------------#
14
15#
16# Esempio di integrazione numerica,
17# uso della formula dei trapezi per integrare
18# x*sin(x) nell'intervallo [1,10]
19#
20
21def f(x)
22  return x*Math::sin(x)
23end
24
25#
26# Metodo dei trapezi
27# a = estremo sinistro intervallo di integrazione
28# b = estremo destro intervallo di integrazione
29# n = numero di intervalli
30# 
31def trapezi( a, b, n ) # argomento nascosto: blocco 
32  h   = (b.to_f-a.to_f)/n.to_f
33  res = (f(a)+f(b))/2
34  for i in 1...n do
35    xi = a+i*h # calcolo nodo di quadratura interno
36    res += yield(xi) ;
37  end
38  return res*h
39end
40
41# integrale esatto calcolato "a mano"
42esatto = Math::sin(10)-10*Math::cos(10)
43
44a = 0
45b = 10
46
47n = 10
48trap = trapezi(a,b,n){ |x| x*Math::sin(x) }
49puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
50
51n = 20
52trap = trapezi(a,b,n){ |x| x*Math::sin(x) }
53puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
54
55n = 40
56trap = trapezi(a,b,n){ |x| x*Math::sin(x) }
57puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
58
59n = 80
60trap = trapezi(a,b,n){ |x| x*Math::sin(x) }
61puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"
62
63n = 160
64trap = trapezi(a,b,n){ |x| x*Math::sin(x) }
65puts "trapezi(#{a},#{b},#{n}), I = #{trap}, Errore = #{trap-esatto}"