Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function
dsearch
Busca binária (também conhecida como busca dicótoma em francês)
Seqüência de Chamamento
[ind, occ, info] = dsearch(X, val [, ch ])
Parâmetros
- X
um vetor ou matriz de reais
- val
um vetor (linha ou coluna) de reais com n componentes em ordem estritamente crescente val(1) < val(2) < ... < val(n)
- ch
(opcional) um caractere "c" ou "d" (valor padrão "c")
- ind
um vetor ou matriz de reais com as mesmas dimensões que X
- occ
um vetor de reais com o mesmo formato que val (mas com n-1 componentes no caso em que ch="c")
- info
inteiro
Descrição
Esta função é útil para encontrar em uma tabela ("table") ordenada e/ou contar o número de componentes de um vetor caindo em algumas classes (sendo uma classe um intervalo ou um valor).
Por padrão ou quando ch="c"
, temos o caso de
intervalos, isto é, para cada X(i), busca em qual dos n-1 intervalos o
componente do vetor cai, sendo os intervalos definidos por:
I1 = [val(1), val(2)] Ik = (val(k), val(k+1)] for 1 < k <= n-1 ;
e:
- ind(i)
é o número do intervalo de X(i) (0 se X(i) não está em [val(1),val(n)])
- occ(k)
é o número de componentes de X que estão em Ik
- info
é o número de componentes de X que não estão em [val(1),val(n)]
Quando ch="d"
, temos o caso discreto, isto é,
para cada X(i) busca se é igual a um valor val(k) e:
- ind(i)
é igual ao índice do componente de val que corresponde a X(i) (ind(i) = k se X(i)=val(k)) ou 0 se X(i) não está em val.
- occ(k)
é igual ao número de componentes de X iguais a val(k)
- info
é o número de componentes de X que não estão no conjunto {val(1),...,val(n)}
Exemplos
// exemplo #1 (estatística elementar para U(0,1)) m = 50000 ; n = 10; X = grand(m,1,"def"); val = linspace(0,1,n+1)'; [ind, occ] = dsearch(X, val); clf() ; plot2d2(val, [occ/m;0]) // sem normalização: y deve ser próximo de 1/n // exemplo #2 (estatística elementar para B(N,p)) N = 8 ; p = 0.5; m = 50000; X = grand(m,1,"bin",N,p); val = (0:N)'; [ind, occ] = dsearch(X, val, "d"); Pexp = occ/m; Pexa = binomial(p,N); clf() ; hm = 1.1*max(max(Pexa),max(Pexp)); plot2d3([val val+0.1], [Pexa' Pexp],[1 2],"111", ... "Pexact@Pexp", [-1 0 N+1 hm],[0 N+2 0 6]) xtitle( "Distribuição binomial B("+string(N)+","+string(p)+") :" ... +" probabilidades exatas versus as experimentais") // exemplo #3 (polinômio de Hermite seccionado) x = [0 ; 0.2 ; 0.35 ; 0.5 ; 0.65 ; 0.8 ; 1]; y = [0 ; 0.1 ;-0.1 ; 0 ; 0.4 ;-0.1 ; 0]; d = [1 ; 0 ; 0 ; 1 ; 0 ; 0 ; -1]; X = linspace(0, 1, 200)'; ind = dsearch(X, x); // definindo funções bases hermitianas deff("y=Ll(t,k,x)","y=(t-x(k+1))./(x(k)-x(k+1))") // Lagrange esquerdo em Ik deff("y=Lr(t,k,x)","y=(t-x(k))./(x(k+1)-x(k))") // Lagrange direito em Ik deff("y=Hl(t,k,x)","y=(1-2*(t-x(k))./(x(k)-x(k+1))).*Ll(t,k,x).^2") deff("y=Hr(t,k,x)","y=(1-2*(t-x(k+1))./(x(k+1)-x(k))).*Lr(t,k,x).^2") deff("y=Kl(t,k,x)","y=(t-x(k)).*Ll(t,k,x).^2") deff("y=Kr(t,k,x)","y=(t-x(k+1)).*Lr(t,k,x).^2") // plotando a curva Y = y(ind).*Hl(X,ind) + y(ind+1).*Hr(X,ind) + d(ind).*Kl(X,ind) + d(ind+1).*Kr(X,ind); clf(); plot2d(X,Y,2) ; plot2d(x,y,-9,"000") xtitle("Um polinômio seccionado de hermite") // NOTE : a verificação pode ser feita adicionando-se : // YY = interp(X,x,y,d); plot2d(X,YY,3,"000")
Ver Também
Report an issue | ||
<< Search and sort | Search and sort | find >> |