Quote:
sol = NDSolve[{y[x] + y''[x] == -y'[x] Abs[y'[x]], y[0] == 1, y'[0] == 0},y[x],{x,xmin,xmax}]; Plot[y[x] /. sol,{x,xmin,xmax}] metti al posto di xmin e xmax il valore di x rispettivamente minimo e massimo che vuoi plottare (ocio alla singolarità a x = -1.7) |
Quote:
la sola forma sembra suggerire un termine di smorzamento viscoso che dipende dal segno della velocitá... che tipo di problema stai affrontando? giusto per sapere |
Considera per esempio l'integrale da 1 ad e di ln(x)/x in dx
Se poni t = ln(x), differenziando ottieni dt = (1/x) in dx Per gli estremi t(1) = ln(1) = 0 t(e) = ln(e) = 1 Diventa integrale da 0 a 1 di t in dt. Li' è la stessa cosa. Come estremi ottieni 0 per l'estremo di sotto (condizione di contorno) e l'altro risultato facendo la sostituzione che dice lui. In pratica ti basta differenziare la y (derivata per incremento, ottenendo derivata seconda di fi rispetto ad x per dx) e ti rendi subito conto che il tutto torna. |
Quote:
Ti ringrazio, purtroppo però provando tra 0 e 10 mi da una serie di errori tipo questo: ReplaceAll::reps: poi sembra che provi a calcolare numericamente (cioè compaiono prorio dei numeri al posto di x nelle espressioni ) ed infine si blocca dopo alcuni tentativi. Ogni ulteriore scontato dettaglio è gradito perchè non ho mai usato prima questo sw. Ho solo aperto il notebook di mathematica e ficcato dentro la tua espressione tra 0 e 10. |
Quote:
|
1 Allegato(i)
Quote:
sol = NDSolve[{y[x] + y''[x] == -y'[x] Abs[y'[x]], y[0] == 1, y'[0] == 0}, y[x], {x, 0, 10}]; Plot[y[x] /. sol, {x, 0, 10}] |
Quote:
Riprova chiudendo e riaprendo... e guarda gli esempi sia in internet che nell'aiuto : ) |
Quote:
Ora considerando che la mia espressione in realtà è: -LS/(gΩ)y'' - 2y = (1/(2g))y'|y'|(Lλ/D) come scrivo un codice veloce che mi permetta di fare una analisi al variare di λ, D, L, S, Ω ? In matlab si poteva fare in modo che in input venissero chiesti questi parametri. Ad esempio sarebbe utile un codice che mi permettesse di plottare la soluzione al variare di λ tra 0 e 100 (ad esempio). Grazie mille! |
Quote:
credo mancasse la S maiuscola in NDSolve |
Quote:
f[omega_, L_, d_, S_, lambda_, g_] := NDSolve[{-L S/(g omega) y''[x] - 2 y[x] == 1/(2 g) y'[x] Abs[y'[x]] L lambda/d , y[0] == 1, y'[0] == 0}, y[x], {x, 0, 10}]; (* fissi i valori di omega,L,d,S,g qui sotto*) omega = 20. ; L = 1. ; d = 2.; g = 0.2; S = 4.; a = 5; (* è il passo con cui vari lambda da 1 a 100*) fun = Table[y[x] /. f[omega, L, d, S, lambda, g], {lambda, 1, 100, a}]; Plot[fun, {x, 0, 10}] |
Quote:
grande! Ancora grazie! Mi piace questo mathematica! Immagino di poter fare lo stesso giochetto che hai fatto con il parametro lambda per tutti quanti gli altri vero? Ti chiedo ancora una cosa: se voglio calcolare dopo quanto tempo l'ampiezza si è r idotta ad 1/e come faccio? altra cosa: perchè non riesco a plotare y' ? Non dovrebbe bastare cambiare y[x] con y'[x] in fun = Table[y[x] /. f[omega, L, d, S, lambda, g], {lambda, 1, 100, a}]; Plot[fun, {x, 0, 10}][/quote] ? Tnx |
Quote:
aaaahhh capito! :) in pratica la usuale "t" la chiama "y" in quel caso, e come condizioni a contorno (estremi di integrazione) mette quelle scritte all'inizio. Grazie mille!!! :sofico: |
Quote:
ti rispondo velocemente alle tue domande, ma ad occhio credo di non poter fare a meno di dover usare tecnicismi che però, appena si apprendono i concetti base della programmazione mathematica, sono davvero banali; se ti interessa, trovi guide dettagliate nell'help del programma e ovviamente online sul sito wolfram, oltre che libri (ma chi ne ha bisogno con così tanta roba gratis?) 1) si, puoi scegliere di variare un parametro alla volta e plottare le soluzioni al variare di esso, una volta fissati tutti gli altri. cambi semplicemente nel table il nome della variabile su cui cicli (quella tra parentesi graffe prima della fine dell'istruzione, per intenderci) e ti assicuri di aver fissato tutte le altre variabili al valore voluto prima del comando Table. |
Quote:
tnx |
Quote:
imax = Length[fun]; tau = Table[ x /. FindRoot[fun[[i, 1]] == 1/Exp[1], {x, 1}], {i, 1, imax}] implicitamente ho assunto che la funzione al massimo valga 1.; quindi attento, se cambi la condizione iniziale questo comando è da cambiare! controlla sempre che tornino, alla fine sono calcolati numericamente, magari il programma sfasa.. per quanto riguarda la derivata prima cado dalle nubi anche io, perché si fa in quel modo e con altri esempi più semplici la cosa funziona... |
Quote:
Forse va cambiato pure prima? |
Quote:
f[omega_, L_, d_, S_, lambda_, g_] := NDSolve[{-L S/(g omega) y''[x] - 2 y[x] == 1/(2 g) y'[x] Abs[y'[x]] L lambda/d , y[0] == 1, y'[0] == 0}, y, {x, 0, 10}]; (* fissi i valori di omega,L,d,S,g qui sotto*) omega = 20. ; L = 1. ; d = 2.; g = 0.2; S = 4.; a = 5; (* è il passo con cui vari lambda da 1 a 100*) fun = Table[y[x] /. f[omega, L, d, S, lambda, g], {lambda, 1, 100, a}]; funder = Table[ y'[x] /. f[omega, L, d, S, lambda, g], {lambda, 1, 100, a}]; Plot[fun, {x, 0, 10}] Plot[funder, {x, 0, 10},PlotRange->Full] imax = Length[fun]; tau = Table[ x /. FindRoot[fun[[i, 1]] == 1/Exp[1], {x, 1}], {i, 1, imax}] |
Quote:
grazie mille ancora!!! Devo però segnalarti un problema. Usando il nuovo codice sembra che i risultati siano diversi, in particolare dal plot di y sembra che l'oscillazione sia smorzata in tempi molto più lunghi rispetto a prima. Posso chiederti di provare da te il codice con i seguenti parametri? y(0)=0.01 (quindi si deve correggere l'espressione per i tempi di smorzamento) omega = 0.000785; L = 0.1; d = 0.01; g = 9.81; S = 0.001; a = 0.04; lambda da 0 a 0.1 e plottare tutto tra 0 e 30 secondi edit errore mio, non cambia nulla. ora l'unico problema è che non mi calcola i tempi di smorzamento se cambio l'ampiezza iniziale da 1 al valore più realistico di 0.01 |
Quote:
in cima al file aggiungi una variabile (diciamo in, o come ti pare a te), la setti al valore che vuoi come condizione iniziale, e in DNSolve, al posto di y[0] == 1 scrivi y[0] == in; poi modifica il comando FindRoot così: FindRoot[fun[[i, 1]] == in/Exp[1], {x, 1}] nel caso in cui fallisca ancora la ricerca dei tempi di smorzamento, devi cambiare l'ultimo parametro nell'ultima graffa del comando FindRoot, che praticamente è il punto x in cui inizia a trovare numericamente le soluzioni dell'equazione p.s. comunque noto ora che le cose funzionano male quando il moto è oscillante ....tutte le volte che facevo le prove usavo moti smorzati esponenzialmente e lì non ci sono problemi a trovare il tempo di smorzamento... ma se oscilla, beh è tutto un altro discorso!!l'unica cosa che posso consigliarti è questa: trova le posizioni dei massimi e dei minimi e vedi quale si avvicina di più al valore voluto...è una cosa approssimata ma credo che di meglio non si possa fare |
Tutti gli orari sono GMT +1. Ora sono le: 02:22. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.