Author Topic: Una funzione per la stabilità dei pendii  (Read 44594 times)

0 Members and 5 Guests are viewing this topic.

afazio

  • Guest
Una funzione per la stabilità dei pendii
« on: 12 December , 2009, 20:22:12 PM »
Proviamo a scrivere la funzione basilare per la verifica di stabilità di un pendio.

Posizione del problema:
- dato un cerchio di cui sono note le coordinate del suo centro ed il raggio
- date le ascisse di inizio e di fine del generico concio
- date le ordinate del profilo, indifferentemente di terreno o di separazione strati o di falda, all'inizio e fine del concio

la funzione deve calcolare l'area del concio e l'angolo formato dalla tangente condotta al piede del concio nel suo punto medio

Il tutto e' rappresentato nella seguente immagine



chiameremo la funzione col nome concio

essa avrà la forma, che definiremo nei dettagli in seguito, del tipo:

concio(xc, yc, R, xi, xf, yi, yf, flag)

al solito, come ormai uso fare, il parametro flag serve a stabilire se vogliamo in uscita l'area A o l'angolo alfa.
Esso pertanto avrà (per adesso) il valore:
1 -  se vogliamo che la funzione ci restituisca l'area
2 -  se vogliamo che la funzione ci restituisca l'angolo

Ci riserviamo di estendere i valori di questo parametro, nel caso in cui si presentasse la necessità di avere altri valori in uscita.

Ovviamente i dati in input devono essere tra loro congruenti, nel senso che a monte il programma deve passare valori di xf maggiori di xi, e devono essere passati tutti nella stessa unità di misura.

A questo punto e' lecita la domanda: cosa ce ne facciamo poi dell'area o dell'angolo?

L'area ci servirà a determinare il peso del concio, basta moltiplicarla per il peso per unità di volume del terreno che costituisce il concio, mentre l'angolo ci servirà per determinarci le sue componenti: la componente normale (N) che utilizzeremo per ricavarci la resistenza a taglio e la componente tangenziale che e' quella che tende a far scivolare il concio.

Proprio adesso mentre scrivo mi sovviene che nel caso in cui il terreno fosse anche coesivo, la resistenza a taglio sarebbe data da due contributi:

Tr = c' *B + N*tan(fi)

e quindi ci serve anche determinarci il valore di B e cioe' lo sviluppo dell'arco al piede del concio. Per fare questo, allora decidiamo di estendere il flag a 3 e restituirci B quando passiamo flag=3

Non escludiamo il fatto che, ai fini sismici, ci servirà anche determinarci l'ordinata del baricentro di A ove poter applicare sia la componente orizzontale che quella verticale della forza sismica inerziale. Ma rinviamo questo ad una fase successiva.
Intanto cominciamo, poichè solo chi inizia ha probabilità di completare.

alla prossima
« Last Edit: 12 December , 2009, 21:23:32 PM by Gilean »

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #1 on: 12 December , 2009, 20:44:11 PM »
Vedo che ti sei gia' dato da fare. Noto anche con interesse che nel VBA usi "L'espediente" di una variabile flag per determinare il parametro in uscita, mentre con c# i metodi possono restituire di default diversi valori a seconda di ciò che desidera il programmatore...per mia curiosità, sei sicuro che questa possibilita' sia negata in VBA?
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #2 on: 12 December , 2009, 20:51:17 PM »
Vedo che ti sei gia' dato da fare. Noto anche con interesse che nel VBA usi "L'espediente" di una variabile flag per determinare il parametro in uscita, mentre con c# i metodi possono restituire di default diversi valori a seconda di ciò che desidera il programmatore...per mia curiosità, sei sicuro che questa possibilita' sia negata in VBA?

Si
questo semplicemente per il fatto che il valore ritornato dalla funzione occuperà la cella che chiama la funzione
La cella puo' contenere un solo valore

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #3 on: 12 December , 2009, 20:56:17 PM »
si ma nel c#(e nel visual basic 2008 se non vado errato) esistono le funzioni multiple in out....domani riprendo il libro di c# e vedo di farti un esempio, perche' mi pare che la stessa cosa possa farsi in VB ma questa e' una parte della programmazione che ho usato raramente, e non mi ricordo bene la sintassi.Ultima domanda: il vba per excel supporta l'overload delle funzioni? perche' se cosi' fosse si potrebbe direttamente sovraccaricare la funzione in modo che a seconda dei parametri in ingresso determini il valore (potremmo addirittura con una sola funzione passare anche spirali logaritmiche per esempio).

 :ciau:

p.s. afazio ultima richiesta. Puoi editare il tuo primo post per inserire come allegato quel file di autocad di cui vedo l'immagine? potrà servire più in la per aggiungerci dati, e sarebbe bene avere sempre la stessa figura, tanto per ordine mentale.
 
« Last Edit: 12 December , 2009, 21:09:57 PM by Gilean »
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

afazio

  • Guest
Re: Re: Una funzione per la stabilità dei pendii
« Reply #4 on: 12 December , 2009, 21:15:55 PM »
si ma nel c#(e nel visual basic 2008 se non vado errato) esistono le funzioni multiple in out....domani riprendo il libro di c# e vedo di farti un esempio, perche' mi pare che la stessa cosa possa farsi in VB ma questa e' una parte della programmazione che ho usato raramente, e non mi ricordo bene la sintassi.Ultima domanda: il vba per excel supporta l'overload delle funzioni? perche' se cosi' fosse si potrebbe direttamente sovraccaricare la funzione in modo che a seconda dei parametri in ingresso determini il valore (potremmo addirittura con una sola funzione passare anche spirali logaritmiche per esempio).

 :ciau:

p.s. afazio ultima richiesta. Puoi editare il tuo primo post per inserire come allegato quel file di autocad di cui vedo l'immagine? potrà servire più in la per aggiungerci dati, e sarebbe bene avere sempre la stessa figura, tanto per ordine mentale.

non farmi nessun esempio di funzioni multiple in c# o in VB, non sono interessato.
Non ho intenzione alcuna di fare programmi (che fino a tempo fa componevo con delphi) stand-alone. Uso Excel e le sue potenzialità e cio mi basta.
Ovviamente in seguito, volendo, tu potrai trasfeire le funzioni adattandole a c#

ora provo ad allegare il file autocad, ma e' banale.

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #5 on: 12 December , 2009, 21:18:39 PM »
Difatti parlavo di questo genere di "Caratteristiche" delle funzioni, perchè stavo pensando ad una parallela trasposizione in C# per farla divenire una applicazione windows a tutti gli effetti. Possiamo andare avanti.
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #6 on: 12 December , 2009, 21:31:50 PM »
allora, la prima cosa che mi viene in mente, così su due piedi, come primo passo, sarebbe calcolarsi l'area del concio. Per far ciò, dovremo conoscere le coordinate dei due vertici finali p1 e p2 del quadrilatero formatosi (i primi due punti li conosciamo e corrispondono con il profilo del terreno). Secondo me, come prima cosa, conoscendo raggio e centro del cerchio, conosciamo anche l'equazione del cerchio stesso. Se intersechiamo ora la circonferenza con la retta x=xi, otteniamo due y, che rappresentano le due ordinate dei punti di intersezione. Potremmo trovare agevolmente il punto scartando la soluzione che da un y>yi. Procedendo analogamente ci troveremmo le coordinate dei punti di intersezione del quadrilatero con la circonferenza.


« Last Edit: 12 December , 2009, 21:33:37 PM by Gilean »
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #7 on: 12 December , 2009, 21:49:14 PM »
Fatte tutte le premesse, iniziamo ad isolare il problema. Vedere pertanto la seguente figura che rappresenta il generico cerchio con dentro il generico concio



la prima cosa che notiamo e' che possiamo sostituire le due ordinate degli estremi superiori del concio con la sua ordinata media

ym = 0.5*(yi +yf )

poiche l'area in rosso e' uguale all'area in blu.
Vedremo poi cosa accase per il primo e l'ultimo concio, quello che e' delimitato dal cerchio e da solo una verticale.

Facedno un passo avanti, l'area del concio puo essere determinata a partire dall'area campita riportata nella immagine che segue.



questa area, che chiamo con A1, la si puo' ottenere come differenza tra le due aree campite della figura che segue



queste due aree dovremmo saperle calcolare agevolmente: vediamo poi come

Adesso immaginiamo di conoscere l'area A1, ed immaginiamo di dimezzarla con una orizzontale passante per il centro ed avente quindi ordinata y=yc

ecco l'immagine risolutiva



adesso e' banale scrivere che l'area A che ci interessa vale:

A = 0.5*A1 - (xf-xi)*(yc-ym)
« Last Edit: 12 December , 2009, 21:57:41 PM by afazio »

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #8 on: 12 December , 2009, 22:15:58 PM »
A questo punto non resta che procedere al calcolo dell'area dei due segmenti circolari riportati in una delle figure precedenti.

L'area del segmento circolare si trova come differenza fra l'area del settore circolare e larea del suo tirnagolo al centro.

L'area del settore circolare e' pari a:

As= pigreco*R²*beta/360

in cui beta (in gradi) e' l'angolo al cetro sotteso dal settore
Se invece volessimo usare beta espresso in radianti, la formula sarebbe:

As= R²*beta/2



in questa immagine viene considerata l'ascissa generica x che puo' essere sia quella finale che quella iniziale del concio

occorre pertanto trovarsi beta
« Last Edit: 12 December , 2009, 22:33:44 PM by afazio »

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #9 on: 12 December , 2009, 23:44:50 PM »
io continuo invece con la mia ipotesi. Una volta trovati i vertici di questo quadrilatero, l'area si puo' trovare facilmente scomponendo il quadrilatero nella somma di un rettangolo + 2 triangoli rettangoli, il tutto con misure note (abbiamo le x e le y dei 4 vertici). Stessa cosa dicasi per il baricentro della figura, che sara' equivalente al baricentro delle figure pesato rispetto alle loro aree.Ovviamente questo algoritmo terrebbe conto in automatico dei conci iniziali e finali, in quanto in questi punti risulterebbe automaticamente verificata l'uguaglianza yf=y2 (primo concio) ed yi=y1 (secondo concio).
« Last Edit: 12 December , 2009, 23:46:57 PM by Gilean »
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

afazio

  • Guest
Re: Re: Una funzione per la stabilità dei pendii
« Reply #10 on: 13 December , 2009, 10:10:18 AM »
io continuo invece con la mia ipotesi. Una volta trovati i vertici di questo quadrilatero, l'area si puo' trovare facilmente scomponendo il quadrilatero nella somma di un rettangolo + 2 triangoli rettangoli, il tutto con misure note (abbiamo le x e le y dei 4 vertici). Stessa cosa dicasi per il baricentro della figura, che sara' equivalente al baricentro delle figure pesato rispetto alle loro aree.Ovviamente questo algoritmo terrebbe conto in automatico dei conci iniziali e finali, in quanto in questi punti risulterebbe automaticamente verificata l'uguaglianza yf=y2 (primo concio) ed yi=y1 (secondo concio).

se procedi con la strada delle intersezioni non risolvi il problema, intanto aggiungi l'approssimazione considerando un trapezio cio' che invece non è.

Tempo fà ho provato anche io a ragionare con le intersezioni sia tra le verticali ed il cerchio e sia tra il pendio (o superfici di separazione o linea di falda) ed il cerchio per delimitare il campo dove procedere con la suddivisione in conci. Il problema della posizione di un segmento rispetto ad un cerchio non e' di facile ed immediata soluzione.
E poi, se ritieni sia una valida via, perch' non inizi a scrivere formule?
Ti ricordo che solo chi inizia puo' terminare.


Io intanto continuo

L'angolo beta lo si puo' determinare attraverso la successiva immagine:



Qui ho anche riportato la dimensione H/2 che ci servirà per determinare l'area del triangolo sotteso dal settore circolare.

beta=2* arccos[ (x-xc)/R ]    e con questo abbiamo beta

mentre la base del triangolo vale:

H=2*R*sin (beta/2)

a questo punto abbiamo anche l'area del triangolo:

At = (x-xc)*R*sin(beta/2)

e quindi l'area del segmento circolare, considerando che l'angolo beta lo abbiamo in radianti, vale:

Aseg = R²*beta/2 - (x-xc)*R*sin(beta/2)

facile no?


A questo punto per evitare di appesantire troppo la funzione concio ci conviene scrivere una funzione dedicata al calcolo dell'area del segmento in cui passando semplicemente l'ascissa del cerchio, il suo raggio e l'ascissa generica x, ci restituisca in un sol botto l'area del segmento



Code: [Select]
function segmento(xc,R,x)


dim beta as double


beta=2*acos( (x-xc)/R )

segmento= R^2*beta/2 - (x-xc)*R*sin(beta/2)

end

quindi dalla nostra funzione e' sufficiente chiamare la funzione segmento una volta passandogli xi ed una volta xf, e fare la differenza tra i due valori restituiti


A1 = segmento (xc, R , xi) - segmento (xc, R , xf)
« Last Edit: 13 December , 2009, 10:40:50 AM by afazio »

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #11 on: 13 December , 2009, 10:19:47 AM »
Adesso non ci rimane altro che capire dove e come questa funzione possa andare in errore ed inserire tutti i controlli necessari.

la prima cosa da verificare e' ovviamente la conguenza dei dati.

- la funzione non deve accettare valori negativi o nulli del raggio, quindi inseriremo la riga:

if R<=0 then concio=0
in questo modo la funzione ci restituisce un valore nullo, ma se vogliamo un avviso che ci faccia comprendere che abbiamo passato un valore privo di senso, e' sufficiente far restituire la stringa "NV" o altro a nostro piacimento.

- i valori di xi e xf devono essere tali che xf>xi
inseriremo quindi la riga:
if xf-xi <=0 then concio=0
anche qui vale la stessa considerazione precedente

adesso andiamo alle aberrazioni

... segue ...

Offline Gilean

  • Administrator
  • Bisnonno Veterano
  • *****
  • Posts: 3292
  • Karma: 202
Re: Una funzione per la stabilità dei pendii
« Reply #12 on: 13 December , 2009, 13:22:05 PM »
Quote
se procedi con la strada delle intersezioni non risolvi il problema, intanto aggiungi l'approssimazione considerando un trapezio cio' che invece non è.

Tempo fà ho provato anche io a ragionare con le intersezioni sia tra le verticali ed il cerchio e sia tra il pendio (o superfici di separazione o linea di falda) ed il cerchio per delimitare il campo dove procedere con la suddivisione in conci. Il problema della posizione di un segmento rispetto ad un cerchio non e' di facile ed immediata soluzione.
E poi, se ritieni sia una valida via, perch' non inizi a scrivere formule?
Ti ricordo che solo chi inizia puo' terminare.

Vedo che su questo problema ci avevi sbattutto la testa precedentemente, ed effettivamente con il mio metodo si commette una approssimazione che è tanto più marcata quanto maggiori sono le distanze tra i due punti successivi del pendio. Sto pensando ora ad una soluzione alternativa che permetta di sfruttare semrpe il mio ragionamento (che potrebbe semplificare di molto l'algoritmo), ma prima di dare formule preferisco ragionarci su, perchè, come dici giustamente tu, solo chi inizia può terminare, solo abbiamo tempi e modi diversi di iniziare :)
Il calcolo è come la pelle delle @@, lo tiri dove vuoi tu.
Esempio di programmazione a Loop:
L'enunciato che segue è falso
L'enunciato precedente è vero.

Nonostante la consapevolezza dei rischi che si corrono dopo aver visto le prestazioni da 3° dan

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #13 on: 13 December , 2009, 19:55:52 PM »
Quindi, riassumendo quanto fin qui analizzato, abbiamo una funzione che pressappoco dovrebbe essere:

Code: [Select]
Function aRccos(num As Double) As Double

aRccos = Atn(-num / Sqr(-num * num + 1)) + 2 * Atn(1)
End Function
'-----

Function segmento(xc As Double, R As Double, x As Double) As Double
Dim beta As Double

beta = 2 * aaRccos((x - xc) / R)
segmento = R ^ 2 * beta / 2 - (x - xc) * R * Sin(beta / 2)

End
'-----
Public Function concio(xc As Double, yc As Double, R As Double, _
                        xi As Double, xf As Double, _
                        yi As Double, yf As Double, flag As Double) As Variant
                       
Dim A As Double
Dim alfa As Double
Dim ym As Double

ym = (yi + yf) / 2

' controllo che il raggio non sia minore o uguale a zero
If R <= 0 Then
    concio = 0
    Exit Function
End If
' controllo che xf sia maggiore di xi
If xf - xi <= 0 Then
    concio = 0
    Exit Function
End If
' controllo che xi ed xf siano all'interno deld iametro del cerchio
If xf <= xc - R Or xi >= xc + R Then
    concio = 0
    Exit Function
End If

A = (segmento(xc, R, xi) - segmento(xc, R, xf)) / 2 - (xf - xi) * (yc - ym)

Select Case flag
    Case 1
        concio = A
    Case 2
        concio = alfa
    Case Else
        concio = 0
End Select

End Function


Ovviamente devo ancora sviluppare la parte di calcolo dell'angolo alfa di inclinazione della tangente.
La funzione arcCos si rende necessaria poiche non e' una funzione inclusa in VBA.

Come vedete bastano davvero pochissime istruzioni cosa praticamente impossibile se si pensa di ricorrere all'intersezione delle verticali col cerchio ed al calcolo dell'are del trapezio.


« Last Edit: 14 December , 2009, 19:32:51 PM by afazio »

afazio

  • Guest
Re: Una funzione per la stabilità dei pendii
« Reply #14 on: 13 December , 2009, 20:31:14 PM »
Procediamo adesso con la determinazione dell'angolo alfa di inclinazione della tangente rispetto all'orizzontale e dello sviluppo dell'arco di base del concio.

Consideriamo pertanto la seguente figura:



Qui le cose sembrano complicarsi ma invece analizzando piu attentamente il tutto, la determinazione di alfa e di B diventa banale.

Infatti l'angolo alfa, rappresentato in bianco in basso, e' uguale a quello rappresentato in rosso in alto per questioni di similitudine tra triangoli. Lascio a voi verificare questa asserzione.

Indicando con delta.i e delta.f rispettivamente l'angolo rispetto alla verticale formato dai raggi che congiungono il punto iniziale e finale del concio, si ha:

delta.i =arcsen[ (xi-xc)/R]
delta.f =arcsen[ (xf-xc)/R]
indicando poi con delta l'angolo formato dai due raggi si ha:

delta= delta.f - delta.i

e l'angolo alfa è fornito dalla espressione:

alfa = delta.i + delta/2

mentre lo sviluppo dell'arco di base del concio vale:

B= delta*R


semplice no?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24