Page 1 of 1

Système d'inéquations assez difficile.

Unread postPosted: 27 Sep 2012, 13:51
by lancelot du lac
Bonjour tout le monde,

je recherche une solution à un problème assez particulier.

mes inéquations sont :

-20*n*log10(1+a²*wc²)>=-Ap
-20*n*log10(1+a²*ws²)<=-As

wc,ws,ap et as sont des constantes définies à chaque fois que le problème est posé.
n est un entier relatif compris entre 1 et 30.
le n choisis serra le plus petit possible. ( en deçà d'une valeur l'équation n'est plus vérifiable quelque soit a ).

ensuite on trouve un intervalle pour a, et on souhaite la valeur qui corresponds à la moyenne géométrique de cette intervalle. ( a=sqrt(amin*amax) )

Il existe des méthodes, en version programme, ou fonction, et d'autre plus pragmatique et moins efficace je trouve, mais je souhaite que ce soit possible sous forme de système via le solveur, en utilisant le symbole sachant que pour indiquer que n est un entier relatif déjà pour commencer.

Bref si vous avez une idée je suis preneur.

Pour comprendre l'application, c'est pour du filtrage analogique du type 1/(1+tau*p)^n
Ap,as,wc, et ws correspondent au gabarit du filtre.

Re: Système d'inéquations assez difficile.

Unread postPosted: 27 Sep 2012, 14:49
by Bisam
En fait, ton problème est vraiment très mal expliqué...

Tu veux que tes inégalité soient vraies pour tout "a", mais c'est impossible puisque si "a" tend vers l'infini, log10(1+a²wc²) fait de même et donc -20n*log10(1+a²wc²) deviendra forcément inférieur à n'importe quelle constante fixée à l'avance.

Il est pour l'instant impossible de te répondre !

Re: Système d'inéquations assez difficile.

Unread postPosted: 27 Sep 2012, 15:30
by lancelot du lac
filtre à amortissement critique ;

Solution de code proposée par bisam

(16:21:02) Bisam: voici les grandes lignes d'un prog qui pourrait marcher demander les valeurs de wc, ws, Ap, AS
n:=1
test:=solve​( inéquation1 and inéquation2​, a)
while test = false
n:=n+1
test:=solve​( inéquation1 and inéquation2​, a)
endwhile
amax:=racin​e(10^(Ac/(20​n))-1)/wc
amin:=racin​e(10^(Ap/(20​n))-1)/wp
amoy:=racin​e(amax*amin)

Je testerais en rentrant.

Re: Système d'inéquations assez difficile.

Unread postPosted: 27 Sep 2012, 18:28
by Bisam
Après de nombreuses questions et réponses sur le chat, j'ai effectivement enfin compris ce que lancelot du lac voulait.
En fait, on cherche tout d'abord le plus petit entier n tel que le système d'inéquations :
-20*n*log10(1+a²*wc²)>=-Ap
-20*n*log10(1+a²*ws²)<=-As

d'inconnue a, ait au moins une solution.
Ensuite, pour cet entier n, on cherche les valeurs extrêmes de a, notées a_max et a_min, et on en calcule la moyenne géométrique.

Lancelot a recopié du chat un début de programme que j'avais proposé.

Plus précisément, je pense que l'on peut écrire cela :
Code: Select all
Define Libpub filtre()=
Prgm
Local wc,ws,ap,as,n,amax,amin
Request "Donner la valeur de Ap",ap
Request "Donner la valeur de As",as
Request "Donner la valeur de wc",wc
Request "Donner la valeur de ws",ws
n:=1
While not(solve(-20*n*log(1+a²*wc²)>=-ap and -20*n*log(1+a²*ws²)<=-as and a>0,a))
n:=n+1
EndWhile
Disp "n est égal à ",n
amax:=racin​e(10^(ap/(20​*n))-1)/wc
amin:=racin​e(10^(as/(20​*n))-1)/ws
Disp "a_moyen vaut ",racin​e(amax*amin)
EndPrgm

Re: Système d'inéquations assez difficile.

Unread postPosted: 27 Sep 2012, 21:24
by lancelot du lac
Le soucis était dans la condition du while. Si c'est une expression, c'est ni true ni false. donc j'ai modifier pour
que ça marche. J'ai ajouter une limitation à 30, car un filtre d'ordre 30 coute très cher, et c'est assez rare d'en voir/faire.

Merci bien pour ton aide ;)

Code: Select all
Define LibPub facritique(ap,as,wc,ws)=
Func
:©facritique(ap,as,wc,ws)
:Local test,n,amax,amin
:1→n
:solve(−10*n*log(1+a^(2)*wc^(2),10)≥−ap and −10*n*log(1+a^(2)*ws^(2),10)≤−as,a)|a>0→test
:While string(test)="false" and n<30
:n:=n+1
:solve(−10*n*log(1+a^(2)*wc^(2),10)≥−ap and −10*n*log(1+a^(2)*ws^(2),10)≤−as,a)|a>0→test
:EndWhile
:If n=30 Then
:  Return undef
:EndIf
:n+1→n
:amax:=((√(10^(((ap)/(20*n)))-1))/(wc))
:amin:=((√(10^(((as)/(20*n)))-1))/(ws))
:√(amax*amin)→test
:approx(test)→test
:Return {"α="&string(test),"n="&string(n)}
:EndFunc