Teoria 2

Da CdM_unimore.

Forze nodali con Castigliano

Il teorema di Castigliano afferma che la derivata parziale dell' energia totale elastica (espressa in termini di forze e di coppie esterne, e non di spostamenti) rispetto ad una forza (coppia) esterna è uguale allo spostamento (rotazione) del punto di applicazione della forza (coppia), nella direzione della forza (coppia) [1]. Con l'utilizzo di Castigliano, nelle strutture isostatiche si individuano le frecce nelle zone rilevanti mentre nelle iperstatiche si ricavano con rapidità le equazioni di congruenza utili per la determinazione delle reazioni vincolari.
Esiste un Castigliano duale che scrive l'energia interna U in termini di spostamenti e derivando rispetto ad essi si ottengono le forze. Scrivo l'energia interna in funzione degli spostamenti, ovvero i delta visti nella lezione precedente:



Dove e


Dove D è la matrice 3x3 che contiene le costanti elastiche E e ν, B è la matrice 3x6 che descrive un operatore differenziale, è il vettore colonna formato dai 6 spostamenti nodali, è la matrice trasposta di B, quindi 6x3 e rappresenta il vettore riga (6) trasposto di .

Quindi la funzione integranda è , ovvero uno scalare.

Da internet formula 48 di Matrix Differentiation [2]:




è intesa come vettore riga, mentre A è una matrice simmetrica, nel nostro caso è un'area, la cambio.


Chiamo e


Allora:



F sono le forze nodali viste però in vettore riga. Per la struttura degli elementi finiti voglio le forze nodali come vettore colonna. Allora:


*


è simmetrico. Ho ottenuto quindi le forze nodali come vettore colonna.

* Si è fatto uso della seguente proprietà del prodotto tra due matrici (MN)T=NTMT, estesa al caso più generico: (ABC...YXZ)T=ZTXTYT...CTBTAT .

Teoria: Esercitazioni per la risoluzione di formule matematiche con programmi in Fortran

N.B:La sezione dichiarativa dei programmi fatti nelle ore di teoria in classe è omessa, per essere scelta a discrezione dello studente. Inoltre i programmi hanno scopo didattico, esclusivamente per la dimostrazione della sintassi dei vari costrutti. Per la compilazione di programmi funzionanti ci si riconduca alle lezioni di laboratorio di Fortran.

Esercizio 1: PROGRAM Somma di serie

Considero la serie numerica:

Quindi la serie verrà risolta tramite il seguente programma (al 10 Nodo):

 C SOMMA DI SERIE 
 
      print*, 'Batti il numero massimo di termini' 
      read*, Nmax

Si crea il primo output che l'utilizzatore avrà per poter immettere il dato Nmax, il programma con la funzione "Read" leggerà il dato immesso da tastiera.

 
      Sum=0.
      Do 10,I10=1,Nmax
      Sum=sum+1/2.**(I10-1)

Il comando serve ad inizializzare il ciclo DO; poichè, come si vedrà in seguito, esso prevede di eguagliare un Sum"nuovo" ad uno "vecchio" sommandolo con un altro termine, si ha bisogno di un valore iniziale definito che crescerà ciclicamente.

 
 10   continue
      print*, 'somma=',sum
      stop
      end

Infine il programma mostrerà a video il risultato del ciclo e del calcolo che si voleva effettuare.

Programma completo:

c234567================================================================!

     program sommaserie_1
     integer nmax,i
     double precision S
     
     print*, 'inserire il numero di termini'
     read*, nmax
     
     S=0.0d0
     do i=1,nmax
      S=S+(1/2.**(i-1))
     enddo
     print*, 'la somma della serie è ',S
  
     stop
     end


Alternativamente, si potrebbe strutturare il "do" come segue:

      do 10, i=1, nmax
      S=S+1/(2.**(i-1))
10    continue

Esercizio 2: PROGRAM Risoluzione Integrale

Considero l'integrale:

Si tratta di un integrale singolare,perchè la funzione integranda(che potrebbe essere l'andamento della tensione) non è definita negli estremi dell'intervallo di integrazione.L'idea è quella di suddividere l'area sottesa alla curva in tanti rettangolini e sommare l'area di ciascuno di essi tante volte quanti sono i rettangolini ovvero il numero di punti scelti.

Definendo:

NELEMS il numero di intervalli scelti , xS e xD gli estremi sinistro e destro rispettivamente, si scrive di seguito il programma Fortran per l'integrazione numerica.

 C INTEGRALE
 
      print*, 'entra numero di elementi' 
      read*, NELEMS
   
     print*, 'entra gli estremi xS,xD' 
      read*, xS,xD

Faccio inserire gli estremi di integrazione e successivamente imposto il ciclo DO;considerando che l'ampiezza di ogni intervallino è(xD - xS)/NELEMS.

   
      AINT=0.
      Do 10,N10=1,NELEMS
      AINTGR=1/sqrt(1-x**2)
      AINT=AINT+AINTGR
  10  continue
      AINT=AINT*(xD-xS)/NELEMS
      print*, 'INT=',AINT
      stop
      end

Codice corretto

c234567---------------------------------------------------------------!
      program integrale2
   	  
   	  integer i, nelems
   	  real A,L
   	  parameter(xs=-1,xd=1)
	  
   	  write(*,*) 'inserire numero intervalli'
   	  read(*,*) nelems
c suddivido l' intervallo in nelems intervalli
      L=(xd-xs)/nelems
   	  A=0
	  do i=1, nelems
  	    x=xs+L/2+(i-1)*L
  	    A=A+L*1./(sqrt(1-x**2))
   	  enddo
   	  write (*,*) 'il risultato dell integrale= ',A
	  
   	  stop
   	  end

Esercizio 3: PROGRAM Sommatoria

Considero la sommatoria:

Il programma fortran che lo risolverà numericamente sarà:

 C SOMMATORIA
      
      Pigr= 2.*acos(0.)
      Epsi=1.E-4

Definisco il parametro pigreco, e la tolleranza epsi, che dovrà avere il confronto tra i due risultati(teorico e numerico) affinchè l'identità venga verificata.Si introduce questa tolleranza e non si usa lo zero, poichè lo 'zero assoluto' nel linguaggio macchina non esiste, e quindi va sostituito con un valore prossimo ad esso, ma che sia coerente con le grandezze che si stanno utilizzando per il confronto. Ad esempio se io confronto una operazione:

 

dove x è uguale a un valore molto piccolo, il programma non darà come output che la condizione è verificata ma, approssimerà il valore di x con la grandezza con cui è stato confrontato. Risulterà quindi:


    
      print*, 'entra nmax' 
      read*, Nmax
      print*, 'entra Theta' 
      read(*,*) Theta
      Sum=0.
      Do 10,N10=2,Nmax
      Sum=Sum+cos(I10*Theta)/(I10**2-1)
  10  continue
      print*, 'SUMNUMERICA=',SUM
      SUMT=1./.2+1./4.*cos(Theta)-1./2.*(Pigr-Theta*sin(Theta))
      print*, 'SUMTEORICA=',SUMT

Anche qui imposto un ciclo Do, che mi permette di ottenere una soluzione numerica, che successivamente confronteremo con la scomposizione secondo la formula di Taylor.

      
      If (ABS(SUM-SUMT).LT.EPSI) then
      print*, 'Vale l''identità'
      else
      print*, 'Non vale l''identità'
      end if

Costrutto IF: questa funzione va ad identificare il costrutto logico: "se 'condizione' verificata scrivi"...", se non è verificata allora scrivi"...". Quindi imposto la mia condizione (in questo caso la differenza in valore assoluto tra le due somme, numerica e teorica, non dovrà sforare la tolleranza),e tramite il comando THEN, vado a impostare il risultato nel caso la condizione sia verificata. Nel caso in cui la condizione non sia verificata, vado a indicare il messaggio di output del programma, tramite il comando ELSE. Il costrutto IF termina con la riga di chiusura END IF.

   
      stop
      end

Ho quindi ottenuto un programma che mi confronta la sommatoria numerica di una funzione a N elementi, con la sua soluzione teorica in serie di Taylor. Inoltre da un riscontro sull'effettiva coerenza dell'identità con la tolleranza utilizzata per sostituire lo zero.

Esercizio: integrale con Maxima

Risoluzione dell'esercizio a pagina 10 della dispesa di progettazione assistita con il programma Maxima.

Integrale maxima.bmp

Bibliografia

  1. Antonio Strozzi, Costruzione di Macchine, Pitagora Editrice Bologna
  2. Matrix Differentiation ( and some other stuff ) Randal J. Barnes Department of Civil Engineering, University of Minnesota Minneapolis, Minnesota, USA http://www.atmos.washington.edu/~dennis/MatrixCalculus.pdf
  3. Antonio Strozzi, Dispensa: Progettazione assistita di strutture meccaniche