Preciso criar vetores aleatórios de números reais a_i atendendo às seguintes restrições:
abs(a_i) < c_i;
sum(a_i)< A; # sum of elements smaller than A
sum(b_i * a_i) < B; # weighted sum is smaller than B
aT*A*a < D # quadratic multiplication with A smaller than D
where c_i, b_i, A, B, D are constants.
Qual seria o algoritmo típico para gerar eficientemente esse tipo de vetor?
random-generation
LouisChiffre
fonte
fonte
a_i
segue a distribuiçãop_i
e também é menos issoc
? Issop_i
ocorre porque a distribuição também é menor que issoc
? Em qual distribuição você está pensando?c
,A
,B
e lambdas fixo?Respostas:
Se bem entendi, apenas pontos em um pequeno volume de espaço n-dimensional atendem às suas restrições.
Sua primeira restrição o restringe ao interior de uma hiperesfera, o que me lembra as perguntas frequentes comp.graphics.algorithms "Pontos aleatórios uniformes na esfera" e Como gerar pontos uniformemente distribuídos na bola unitária em 3-d? A segunda restrição corta um pouco da hiperesfera, e as outras restrições diminuem ainda mais o volume que atende às suas restrições.
Eu acho que a coisa mais simples a fazer é uma das abordagens sugeridas pelo FAQ:
Com o gerador de números aleatórios de qualidade suficientemente alta, isso fornece um conjunto de coordenadas armazenadas que atendem aos seus critérios com densidade uniforme (esperada).
Infelizmente, se você possui uma dimensionalidade relativamente alta n (isto é, se você constrói cada vetor a partir de uma lista relativamente longa de coordenadas), a esfera inscrita (muito menos o seu volume reduzido) possui uma parte surpreendentemente pequena do volume total de a caixa delimitadora total, portanto, pode ser necessário executar muitas iterações, a maioria delas gerando pontos rejeitados fora da área restrita, antes de encontrar um ponto dentro da área restrita. Como os computadores hoje em dia são bem rápidos, isso será rápido o suficiente?
fonte
f1(x1) + f2(x2) == C
Alguma sugestão aqui?