Hardware Upgrade Forum

Hardware Upgrade Forum (https://www.hwupgrade.it/forum/index.php)
-   Scienza e tecnica (https://www.hwupgrade.it/forum/forumdisplay.php?f=91)
-   -   [Official Thread]Richieste d'aiuto in MATEMATICA: postate qui! (https://www.hwupgrade.it/forum/showthread.php?t=1221191)


Lampo89 16-04-2014 20:58

Quote:

Originariamente inviato da dario fgx (Messaggio 40994087)
Ciao e grazie.


Allora usando mathematica (che non avevo mai usato), ho ficcato dentro questa espressione:

NDSolve[{y[x] + y''[x] == -y'[x]*Abs[y'[x]]}, y[0] = 1, y'[0] = 0]

ma non succede nulla. sembra suggerirmi un'altra espressione dalla sintassi più semplice ma non la risolve ugualmente.

Suggerimenti?

Inserisci queste due righe:
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)

kikino 17-04-2014 09:48

Quote:

Originariamente inviato da dario fgx (Messaggio 40994087)
Ciao e grazie.


Allora usando mathematica (che non avevo mai usato), ho ficcato dentro questa espressione:

NDsolve[{y[x] + y''[x] == -y'[x]*Abs[y'[x]]}, y[0] = 1, y'[0] = 0]

ma non succede nulla. sembra suggerirmi un'altra espressione dalla sintassi più semplice ma non la risolve ugualmente.

Suggerimenti?

da dove ti esce fuori un equazione non lineare di questo tipo?
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

MetalDetector 17-04-2014 10:54

Ciao ragazzi,
nell'analisi di dispositivi microelettronici (MOSFET per la precisione) mi ritrovo a dover affrontare questo passaggio matematico che non riesco bene a comprendere.
In particolare, si tratta di conversione di un integrale rispetto ad un'altra variabile, visto che " l'integrale rispetto alla variabile spazio (x) dipende dallo spazio solo attraverso il potenziale ( φ(x) ) pare si possa fare. Chiaramente il tutto è stato spiegato da un ingegnere che ne ha svilito gli aspetti formalmente analitici (niente flame, sono ing anch'io xD :D).
Chi mi aiuta a capire? :) Grazie infinite!!


ciriccio 17-04-2014 12:21

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.

dario fgx 17-04-2014 13:15

Quote:

Originariamente inviato da Lampo89 (Messaggio 40994309)
Inserisci queste due righe:
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)


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.

dario fgx 17-04-2014 13:17

Quote:

Originariamente inviato da kikino (Messaggio 40995398)
da dove ti esce fuori un equazione non lineare di questo tipo?
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

esattamente: sono 2 vasi comunicanti in uno dei 2 c'è un eccesso di altezza del liquido e voglio analizzare il tempo che ci mette a smorzare l'oscillazione dell'altezza del liquido. Anzi se tu volessi aiutarmi, ti spiego nel dettaglio quel che si vorrebbe fare..

Lampo89 17-04-2014 13:29

1 Allegato(i)
Quote:

Originariamente inviato da dario fgx (Messaggio 40996437)
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.

sono un pirla io che mi sono dimenticato una maiuscola nel comando, ti linko una immagine del plot nel caso non riuscissi a risolvere; riscrivo anche il comando corretto:

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}]

ciriccio 17-04-2014 13:32

Quote:

Originariamente inviato da dario fgx (Messaggio 40996437)
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.

Prima di risponderti avevo provato ed a me andava.

Riprova chiudendo e riaprendo... e guarda gli esempi sia in internet che nell'aiuto : )

dario fgx 17-04-2014 14:08

Quote:

Originariamente inviato da Lampo89 (Messaggio 40996509)
sono un pirla io che mi sono dimenticato una maiuscola nel comando, ti linko una immagine del plot nel caso non riuscissi a risolvere; riscrivo anche il comando corretto:

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}]

Grazie, adesso funziona.

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!

dario fgx 17-04-2014 14:09

Quote:

Originariamente inviato da ciriccio (Messaggio 40996516)
Prima di risponderti avevo provato ed a me andava.

Riprova chiudendo e riaprendo... e guarda gli esempi sia in internet che nell'aiuto : )


credo mancasse la S maiuscola in NDSolve

Lampo89 17-04-2014 15:12

Quote:

Originariamente inviato da dario fgx (Messaggio 40996682)
Grazie, adesso funziona.

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!

Ho scritto al volo questo codice, ho fatto anche una prova con parametri inventati e da robe sensate

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}]

dario fgx 17-04-2014 15:54

Quote:

Originariamente inviato da Lampo89 (Messaggio 40996943)
Ho scritto al volo questo codice, ho fatto anche una prova con parametri inventati e da robe sensate

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}]


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

MetalDetector 17-04-2014 17:06

Quote:

Originariamente inviato da ciriccio (Messaggio 40996181)
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.


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:

Lampo89 17-04-2014 18:04

Quote:

Originariamente inviato da dario fgx (Messaggio 40997120)
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}]

?


Tnx

mathematica è davvero un bellissimo programma, è ottimo per la manipolazione di espressioni algebriche, risolve numericamente ed esattamente equazioni e sistemi di equazioni, fa plot, istogrammi, generazione di numeri pseudocasuali secondo un gran numero di pdf, ci sono molti add on che estendono le funzionalità..
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.

dario fgx 17-04-2014 18:31

Quote:

Originariamente inviato da Lampo89 (Messaggio 40997551)
mathematica è davvero un bellissimo programma, è ottimo per la manipolazione di espressioni algebriche, risolve numericamente ed esattamente equazioni e sistemi di equazioni, fa plot, istogrammi, generazione di numeri pseudocasuali secondo un gran numero di pdf, ci sono molti add on che estendono le funzionalità..
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.

si certo, l'avevo intuito. Poi quando puoi mi spieghi anche perchè non riesco a plottare la derivata prima (come dicevo nel post precedente)

tnx

Lampo89 17-04-2014 18:33

Quote:

Originariamente inviato da Lampo89 (Messaggio 40997551)
mathematica è davvero un bellissimo programma, è ottimo per la manipolazione di espressioni algebriche, risolve numericamente ed esattamente equazioni e sistemi di equazioni, fa plot, istogrammi, generazione di numeri pseudocasuali secondo un gran numero di pdf, ci sono molti add on che estendono le funzionalità..
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.

Per i tempi di smorzamento aggiungi queste linee:
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...

ciriccio 17-04-2014 18:49

Quote:

Originariamente inviato da dario fgx
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}]


Forse va cambiato pure prima?

Lampo89 17-04-2014 19:05

Quote:

Originariamente inviato da Lampo89 (Messaggio 40997675)
Per i tempi di smorzamento aggiungi queste linee:
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...

per quanto riguarda la derivata errore mio, una istruzione che ho scritto non consentiva quel giochino ... riscrivo tutto il codice


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}]

dario fgx 17-04-2014 20:11

Quote:

Originariamente inviato da Lampo89 (Messaggio 40997806)
per quanto riguarda la derivata errore mio, una istruzione che ho scritto non consentiva quel giochino ... riscrivo tutto il codice


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}]


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

Lampo89 17-04-2014 21:52

Quote:

Originariamente inviato da dario fgx (Messaggio 40998052)
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

modificarlo è un attimo;
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: 12:41.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.