[Python] Aiuto per persona alle prime armi...

Messaggioda crynow » 16/07/2020, 17:10

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 :shock:

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
crynow
Junior Member
Junior Member
 
Messaggio: 32 di 106
Iscritto il: 30/06/2019, 17:59

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda Flamber » 17/07/2020, 16:37

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
Avatar utente
Flamber
Advanced Member
Advanced Member
 
Messaggio: 1094 di 2188
Iscritto il: 27/03/2012, 07:49

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda cyrus » 17/07/2020, 17:27

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.
cyrus
Junior Member
Junior Member
 
Messaggio: 66 di 162
Iscritto il: 16/07/2016, 14:53

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda apatriarca » 17/07/2020, 20:29

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:
Codice:
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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5463 di 10438
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda crynow » 18/07/2020, 07:27

Immagine

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.
crynow
Junior Member
Junior Member
 
Messaggio: 33 di 106
Iscritto il: 30/06/2019, 17:59

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda vict85 » 19/07/2020, 17:39

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:
  1. 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\).
  2. Usando altezza e angolo, ovvero con la formula \(\displaystyle q = \frac{d}{\sin\theta}\).
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).
vict85
Moderatore
Moderatore
 
Messaggio: 10157 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda crynow » 20/07/2020, 08:26

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
crynow
Junior Member
Junior Member
 
Messaggio: 34 di 106
Iscritto il: 30/06/2019, 17:59

Re: [Python] Aiuto per persona alle prime armi...

Messaggioda vict85 » 20/07/2020, 09:36

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).
vict85
Moderatore
Moderatore
 
Messaggio: 10158 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite