In teoria sono spline di terzo grado, ma non ho trovato conferme…
Partendo da una linea L=10 e a 3/10 voglio un angolo di 15 gradi, ho fatto a mano due curve interpolate di grado 3 passante per 3 punti:
Entrambe soddisfano i 15gradi a 3/10 di lunghezza.
Galapagos può trovare questa soluzione, ma non è detto sia l’unica corretta.
Ergo, di nuovo torno a pensare che sia un problema indefinito.
Se hai più posizioni in lunghezza con ciascuna un determinato angolo da rispettare, le soluzioni finali probabilmente convergono e diventano più simili.
I punti da interpolare a inizio e fine sono fissi. Gli altri punti da far muovere a galapagos sarebbero da vincolare almeno in X, no?
Se i punti intermedi hanno libertà sia in X che Z … mi sembra il solito problema indefinito, probabilmente galapagos trova anche qualcosa…
Comunque non continuerò a rispondere in questa direzione perché non ho la pretesa di insegnare niente a nessuno. Sono qui per chiedere aiuto e se possibile darlo, nel concreto, con i fatti.
La tua dimostrazione è interessante, in realtà però anche aumentando i punti (fissandone la X e lasciando libera la Z) non migliora il risultato, ovvero, come mi fai notare, esistono più soluzioni.
La scelta della migliore dovrebbe essere fatta con l’energia elastica ma con questo metodo “geometrico” (passatemi il termine) non se ne tiene di conto.
La mia idea (che sottolineo non spaccio come funzionante, bensì solo un’idea) era che se avessi fornito all’asta indeformata una proprietà elastica, immagina un’asta di metallo quindi con una sezione ed un modulo elastico, questa si sarebbe disposta nella conformazione (tra le molteplici possibili) che richiedeva meno lavoro di deformazione.
Non so se sono riuscito a spiegarmi, probabilmente è un’idea senza senso, non so, ma questo era il concetto iniziale.
Ne ho esattamente 3 nella realtà, più due sugli appoggi che però non possono scorrere lungo Z. Ho comunque provato a fissarne 2 ma non sembra migliorare il risultato poiché la curva trovata non rispetta evidentemente la curva di deformazione reale della trave.
Probabilmente, o almeno questo è quello che penso, per il motivo riferito al lavoro di deformazione di cui ho parlato a Riccardo.
Scusami, me se siamo in campo statico, la cinematica della trave che c’entra? Se parli di cinematica non ha senso parlare di condizioni di staticità.
Non che mi cambi molto nella vita eh… ma nel contesto in cui si ragionava si.
Se hai una sezione e assegni tutti i 3 gli assi baricentrici, la rotazione attorno a y non coincide con quello di rotazione della sezione?
Ad ogni modo vai avanti al piu mi astengo io.
Dai ragazzi è un argomento interessante non serve essere tesi.
Anche secondo me il termine “cinematica” è fuori contesto, dato che stiamo facendo ragionamenti su qualcosa di statico… ma sono solo parole, l’importante è il risultato.
Anziché girare attorno al problema, potresti, per favore, darci tutti i dati che hai?
Ha un caso campione ben misurato?
Tipo foto della realtà + N letture di angoli disposte in vari punti di una trave.
Sennò stiamo qua a chattare nel forum in eterno senza concludere nulla…
Impostare galapagos per muovere a tentativi 2/3/4 punti (sia x che z) non è un problema, è abbastanza banale.
Di sicuro ognuno si sta immaginando un contesto diverso… io ero con i sudori freddi perchè mi vedevo su una trave tutta “intorcolata” al 40° piano di un grattacielo in costruzione… e che mi tocca andare a verificare se il sensore sta leggendo giusto…
Puo’ essere …
Ma se la trave e’ appoggiata alle estremita’ e se il carico e’ solo verso il basso, verrebbe da supporre una forma con concavita’ in alto e senza flessi … poi chi lo sa 'sta trave cosa sta combinando …
allego uno script molto semplice. Calcola la curva in funzione della lunghezza della trave, della posizione del sensore e dell’angolo registrato.
Sergio
'Script written by Ing. Alessi Sergio
'Script copyrighted by Ing. Alessi Sergio
'Script version venerdì 4 ottobre 2024 11:34:27
Option Explicit
Call Main()
Sub Main()
Dim PiGreco: PiGreco = 3.141592654
Dim L: L = rhino.GetReal("Lunghezza della trave")
If isnull(L) Then Exit Sub
Dim P: P = rhino.GetReal("Posizione sensore")
If isnull(P) Then Exit Sub
Dim A: A = rhino.getreal("Angolo sensore")
If isnull(A) Then Exit Sub
If L <= 0 Then Exit Sub
If P <= 0 Then Exit Sub
If P >= L Then Exit Sub
If A >= 80 Then Exit Sub
If A <= -80 Then Exit Sub
Dim V: V = tan(A * PiGreco / 180) * L / 3 / (1 - 2 * P / L)
Call rhino.AddCurve(array(array(0, 0, 0), array(L / 3, V, 0), array(2 * L / 3, V, 0), array(L, 0, 0)), 3)
End Sub
i punti sono equidistanti lungo l’asse x per ottenere l’equazione Y=f(x).
Se non fossero equidistanti la funzione sarebbe un’equazione razionale del tipo Y=g(x)/h(x).
Ho scelto una bezier di grado 3. Poteva essere anche una bezier di grado 2 che equivale ad una trave soggetta ad una coppia (momento) applicato ad un estremo, cosa che ritengo poco realistica. In realtà il grado della curva dipende dalle azioni agenti.
Avendo tre condizioni, punto iniziale e punto finale con spostamenti nulli e una rotazione, ho imposto i punti di controllo intermedi simmetrici (carico concentrato applicato in mezzeria).
Partendo dall’equazione della bezier
C=P0*(1-t)^3+P1*(1-t)^2t+P2(1-t)t^2+P3t^3
l’equazione della derivata è
dC=3*(P1-P0)(1-t)^2+23(P2-P1)t(1-t)+3*(P3-P2)*t^2
Essendo i punti lungo x equidistanti (P1-P0)=(P2-P1)=(P3-P2)=L/3
dC/dx=3*L/3=L
Ovviamente t è ininfluente essendo (1-t)^2+2t(1-t)+t^2 =1 per ogni t (e per ogni grado di curva!)
Ricordando che in y P0=P3=0 e posto P1=P2
dC/dy =3*[(P1)(1-t)^2-P1t^2]=3P1(1-2*t)
Ponendo
(dC/dy)/(dC/dx) = tangente(angolo)
e
t=P/L
si ricava
P1=tan(A * PiGreco / 180) * L / 3 / (1 - 2 * P / L)
Ho provato a fare una cosa piu’ semplice: una definizione che consenta di provare diverse configurazioni di carichi sulla trave e di verificare le conseguenti rotazioni e i conseguenti spostamenti dei sensori.
L’idea sarebbe di cercare, cambiando i carichi, di riprodurre le posizioni e le rotazioni dei sensori riscontrate.
E’ un calcolo alla buona … non so nemmeno se sia corretto …
Considero i diversi carichi e per ognuno di loro il ragionamento (da verificare, come detto) e’ questo:
Lunghezza trave: c
Carico con intensita’ f …
… e con posizione d.
A me risulta un diagramma del momento come nello schizzo, con valore massimo m
m = f \times \frac{c-d}{c}\times d
Da quel diagramma ricaviamo il valore del momento, per quel dato carico, per un certo numero di punti.
Nello schizzo, come esempio, e’ indicato il punto a distanza t
Consideriamo la trave a rigidezza costante, e ricaviamo la sua curvatura nei vari punti dal momento flettente totale in quei punti.
La definizione calcola il momento per ogni punto sommando quelli dovuti ai vari carichi.
E disegna la trave partendo dai valori della curvatura.
Ovviamente e’ una approssimazione, che possiamo cercare di migliorare aumentando il numero dei punti calcolati.
C’e’ anche un coefficiente, utile per ‘aggiustare’ la scala delle deformazioni.
Possiamo pensare che agisca sui carichi o sulla rigidezza della trave …
La definizione presume deformazioni minime.
Definizione molto rozza, soprattutto l’input dei carichi … ( sono un cane con GH ).
E’ solo un tentativo che, ripeto, non so quanto sia corretto.
Questo script esegue un calcolo equivalente al precedente ma restituisce la curva con “energia minima”.
'Script written by Ing. Alessi Sergio
'Script copyrighted by Ing. Alessi Sergio
'Script version venerdì 5 ottobre 2024 16:25:32
Option Explicit
Call Main()
Sub Main()
Dim PiGreco: PiGreco = 3.141592654
Dim L: L = rhino.GetReal("Lunghezza della trave")
If isnull(L) Then Exit Sub
Dim P: P = rhino.GetReal("Posizione sensore")
If isnull(P) Then Exit Sub
Dim A: A = rhino.getreal("Angolo sensore")
If isnull(A) Then Exit Sub
If L <= 0 Then Exit Sub
If P <= 0 Then Exit Sub
If P >= L Then Exit Sub
If A >= 80 Then Exit Sub
If A <= -80 Then Exit Sub
Dim t: t = P / L
Dim V: V = tan(A * PiGreco / 180) * L / ((1.5 - 4.5 * t ^ 2))
Call rhino.AddCurve(array(array(0, 0, 0), array(L / 3, V / 2, 0), array(2 * L / 3, V, 0), array(L, 0, 0)), 3)
End Sub