[Python] Aiuto per persona alle prime armi...
Buonasera, avrei un problema per quanto riguarda un programmino che non riesco a capire come fare, ho cominciato da poco a studiare e mi sono bloccato:
Dopo aver determinato la lunghezza L del perimetro in funzione dei valori di A, d, b, e q; scrivere
una funzione in Python che dati i valori di A, d, b, e q restituisca il valore del perimetro L del canale,
successivamente , scrivere quindi, una funzione in Python che, utilizzando eventualmente la funzione definita in
precedenza, data l’area della sezione A del canale, calcoli i valori di d, b, e q per i quali il perimetro
L del canale assuma il valore minimo,
Realizzare, quindi, una ulteriore funzione Python che diagrammi i valori di L al variare dei parametri
d, b, e q considerando che un’analisi preliminare ha mostrato che l’area A della sezione dovrebbe
essere pari a 100 metri quadrati per trasportare il flusso di acqua desiderato.
il canale è a forma di trapezio isoscele aperto sopra quindi ho (base minore), (altezza), (lati obliqui).
Come dovrei iniziare
Una mia prima soluzione:
def CalcolaPerimetroCanale(A,b,d, theta) #A= area b= base minore d= altezza theta=lati obliqui
e poi non so come fare se non ho la base maggiore
Dopo aver determinato la lunghezza L del perimetro in funzione dei valori di A, d, b, e q; scrivere
una funzione in Python che dati i valori di A, d, b, e q restituisca il valore del perimetro L del canale,
successivamente , scrivere quindi, una funzione in Python che, utilizzando eventualmente la funzione definita in
precedenza, data l’area della sezione A del canale, calcoli i valori di d, b, e q per i quali il perimetro
L del canale assuma il valore minimo,
Realizzare, quindi, una ulteriore funzione Python che diagrammi i valori di L al variare dei parametri
d, b, e q considerando che un’analisi preliminare ha mostrato che l’area A della sezione dovrebbe
essere pari a 100 metri quadrati per trasportare il flusso di acqua desiderato.
il canale è a forma di trapezio isoscele aperto sopra quindi ho (base minore), (altezza), (lati obliqui).
Come dovrei iniziare

Una mia prima soluzione:
def CalcolaPerimetroCanale(A,b,d, theta) #A= area b= base minore d= altezza theta=lati obliqui
e poi non so come fare se non ho la base maggiore
Risposte
Potresti essere più chiaro? L è il perimetro della sezione? cosa sono quegli altri valori? Ti conviene postare la traccia completa dell'esercizio in modo da rendere tutto più chiaro.
Detto questo, più che un problema di programmazione mi sembra un problema di geometria di base
Detto questo, più che un problema di programmazione mi sembra un problema di geometria di base
La base maggiore devi ricavarla tu a partire dai dati forniti in input. In questo caso devi applicare il teorema di pitagora sul triangolo costituito dal lato obliquo del trapezio, dall'altezza e da una parte della base maggiore.
Poi devii moltiplicare per due il pezzo della base maggiore ottenuto e poi sommarlo alla base minore.
Poi devii moltiplicare per due il pezzo della base maggiore ottenuto e poi sommarlo alla base minore.
Siccome l'area è uguale a
\[A = \frac{(B + b)\,d}{2} \]
puoi calcolarti il perimetro senza bisogno di calcolarti la base maggiore (\(B\)) semplicemente con la formula
\[ L = (B + b) + 2\,q = 2\,\left(\frac{A}{d} + q\right) \]
In Python sarebbe qualcosa come:
Puoi anche usare la trigonometria o il teorema di Pitagora per calcolarti \(B\) a partire da \(b,\) \(q\) e \(d\) ma la formula verrebbe in realtà solo più complicata.
\[A = \frac{(B + b)\,d}{2} \]
puoi calcolarti il perimetro senza bisogno di calcolarti la base maggiore (\(B\)) semplicemente con la formula
\[ L = (B + b) + 2\,q = 2\,\left(\frac{A}{d} + q\right) \]
In Python sarebbe qualcosa come:
def perimetro_canale(A, b, d, q): return 2.0 * (A / d + q)
Puoi anche usare la trigonometria o il teorema di Pitagora per calcolarti \(B\) a partire da \(b,\) \(q\) e \(d\) ma la formula verrebbe in realtà solo più complicata.

l'esercizio è questo
grazie per le risposte che state dando
la base maggiore sull'esercizio completo c'è scritto che non deve essere tenuta presente in quanto sopra è aperto.
Mi sembra che il tuo problema sia più matematico che informativo.
La base grande, come mostrato da apatriarca, corrisponde a \(\displaystyle B = \frac{A}{d} - b\).
I lati obliqui possono essere calcolati in due modi:
[list=1][*:1ebjdoht] Utilizzando il teorema di pitagora, ovvero osservando che i lati obliqui sono congruenti alla diagonale di un triangolo rettangolo con lati \(\displaystyle l_1 = \frac{B - b}{2}\) e \(l_2=d\).[/*:m:1ebjdoht]
[*:1ebjdoht] Usando altezza e angolo, ovvero con la formula \(\displaystyle q = \frac{d}{\sin\theta}\). [/*:m:1ebjdoht][/list:o:1ebjdoht]
La seconda è più sintetica, quindi utilizzo quella nel seguito.
Dalla formula di apatriarca si ricava: \(\displaystyle L(A, d, \theta) = 2\frac{ A + d^2 }{d\sin \theta}\).
A questo punto si tratta di un problema di ottimizzazione. Suppongo che l'idea del professore sia quello di trovare il minimo con il metodo del gradiente (https://it.wikipedia.org/wiki/Discesa_del_gradiente). Ma è possibile che tu possa trovare la soluzione analiticamente (non ho provato a farlo).
La base grande, come mostrato da apatriarca, corrisponde a \(\displaystyle B = \frac{A}{d} - b\).
I lati obliqui possono essere calcolati in due modi:
[list=1][*:1ebjdoht] Utilizzando il teorema di pitagora, ovvero osservando che i lati obliqui sono congruenti alla diagonale di un triangolo rettangolo con lati \(\displaystyle l_1 = \frac{B - b}{2}\) e \(l_2=d\).[/*:m:1ebjdoht]
[*:1ebjdoht] Usando altezza e angolo, ovvero con la formula \(\displaystyle q = \frac{d}{\sin\theta}\). [/*:m:1ebjdoht][/list:o:1ebjdoht]
La seconda è più sintetica, quindi utilizzo quella nel seguito.
Dalla formula di apatriarca si ricava: \(\displaystyle L(A, d, \theta) = 2\frac{ A + d^2 }{d\sin \theta}\).
A questo punto si tratta di un problema di ottimizzazione. Suppongo che l'idea del professore sia quello di trovare il minimo con il metodo del gradiente (https://it.wikipedia.org/wiki/Discesa_del_gradiente). Ma è possibile che tu possa trovare la soluzione analiticamente (non ho provato a farlo).
Il primo punto dove mi chiede di calcolare il perimetro l'ho fatto.
Ma non riesco a capire come fare per il secondo punto (def dimensionaCanale(A)), come fare a ricavarmi gli altri valori
Ma non riesco a capire come fare per il secondo punto (def dimensionaCanale(A)), come fare a ricavarmi gli altri valori
Una volta trovato \(A\), \(d\) e \(\theta\) puoi ricavarti tutti gli altri. Infatti \(\displaystyle \frac{b+B}{2} = \frac{A}{q} \). Inoltre puoi usare la trigonometria per calcolarti \(B-b\).
Nota che, fissati \(A = A_0\) e \(d = d_0\), \(L(A_0,d_0,\theta)\) ha un minimo in \(\displaystyle \theta = \frac{\pi}{2}\). Quindi la forma minima deve essere un rettangolo, quindi \(b=B\).
A questo punto andrebbe trovato il minimo di \(L(b, d) = b + d\) con \(A = bd\) con \(A\) fissato. Mi rendo conto che la discesa del gradiente non era il metodo corretto dato che non prevede un vincolo. D'altra parte, siccome \(A\) è un input della funzione, si tratta di ottimizzare \(\displaystyle L(d) = \frac{A}{d} + d\) che è una funzione ad una sola variabile. Ha derivata \(\displaystyle L'(d) = \frac{d^2 - A}{d^2}\). La soluzione è \(d = b = \sqrt{A}\) (cosa prevedibile data la simmetria sia nel vincolo che nella funzione da ottimizzare).
Nota che, fissati \(A = A_0\) e \(d = d_0\), \(L(A_0,d_0,\theta)\) ha un minimo in \(\displaystyle \theta = \frac{\pi}{2}\). Quindi la forma minima deve essere un rettangolo, quindi \(b=B\).
A questo punto andrebbe trovato il minimo di \(L(b, d) = b + d\) con \(A = bd\) con \(A\) fissato. Mi rendo conto che la discesa del gradiente non era il metodo corretto dato che non prevede un vincolo. D'altra parte, siccome \(A\) è un input della funzione, si tratta di ottimizzare \(\displaystyle L(d) = \frac{A}{d} + d\) che è una funzione ad una sola variabile. Ha derivata \(\displaystyle L'(d) = \frac{d^2 - A}{d^2}\). La soluzione è \(d = b = \sqrt{A}\) (cosa prevedibile data la simmetria sia nel vincolo che nella funzione da ottimizzare).