Zasadniczo nie da się zrobić ogólnego zestawienia nierówności wielomianowych, za pomocą dowolnej metody, innej niż wyszukiwanie enumeratywne, nawet jeśli istnieje skończona liczba rozwiązań. (Być może powinienem powiedzieć, że nie jest to banalne, ponieważ jest to możliwe, ponieważ wyszukiwanie wyliczeniowe będzie działało, z zastrzeżeniem kwestii zmiennoprzecinkowych.) Należy zauważyć, że domena zainteresowania nie musi być po prostu połączona w przypadku nierówności wyższego rzędu.
Edytuj: OP zadał pytanie, w jaki sposób można przystąpić do wyszukiwania.
rozważyć problem
x^3 + y^3 >= 1e12
x^4 + y^4 <= 1e16
x >= 0, y >= 0
rozwiązać dla wszystkich rozwiązań całkowitych tego systemu. Zauważ, że całkowite programowanie w DOWOLNEJ formie nie wystarczy tutaj, ponieważ żądane są WSZYSTKIE rozwiązania liczb całkowitych.
Użycie siatki siatkowej zmusiłoby nas do spojrzenia na punkty w domenie (0: 10000) X (0: 10000). Zmusiłoby to nas do wypróbowania zestawu 1e8 punktów, testowania każdego punktu, aby sprawdzić, czy spełniają one ograniczenia.
Prosta pętla może być potencjalnie bardziej wydajna, chociaż nadal będzie wymagać pewnego wysiłku.
% Note that I will store these in a cell array,
% since I cannot preallocate the results.
tic
xmax = 10000;
xy = cell(1,xmax);
for x = 0:xmax
% solve for y, given x. This requires us to
% solve for those values of y such that
% y^3 >= 1e12 - x.^3
% y^4 <= 1e16 - x.^4
% These are simple expressions to solve for.
y = ceil((1e12 - x.^3).^(1/3)):floor((1e16 - x.^4).^0.25);
n = numel(y);
if n > 0
xy{x+1} = [repmat(x,1,n);y];
end
end
% flatten the cell array
xy = cell2mat(xy);
toc
Czas potrzebny był ...
Elapsed time is 0.600419 seconds.
Spośród 100020001 kombinacji, które moglibyśmy testowanych, ile rozwiązań nie znajdziemy?
size(xy)
ans =
2 4371264
Oczywiście, wyczerpujące wyszukiwanie jest łatwiejsze do napisania.
tic
[x,y] = meshgrid(0:10000);
k = (x.^3 + y.^3 >= 1e12) & (x.^4 + y.^4 <= 1e16);
xy = [x(k),y(k)];
toc
Uruchomiłem to na komputerze 64-bitowym, z 8 gig pamięci RAM. Ale nawet sam test był wieżą CPU.
Elapsed time is 50.182385 seconds.
Należy pamiętać, że rozważania zmiennoprzecinkowe czasami powodują różną liczbę punktów, w zależności od sposobu obliczeń.
Na koniec, jeśli równania ograniczenia są bardziej złożone, może być konieczne użycie pierwiastków w wyrażeniu dla granic y, aby pomóc określić, gdzie są spełnione ograniczenia. Przyjemnie jest, że wciąż działa na bardziej skomplikowane wielomianowe granice.
@woodchips, to nie jest możliwe i nie ma również algorytmu? – Graviton
@Ngu: Myślę, że jedną z konsekwencji niemożliwego problemu jest to, że nie ma algorytmu, który mógłby go rozwiązać. Zgadzam się z @woodchips. Jeśli w to wątpisz, zacznij spisywać, za pomocą pióra i papieru, kilka pierwszych (x, y) par, które spełniają twoje nierówności. Zatrzymaj się na chwilę i pomyśl. –
Dla ogólnego problemu NIE, nie ma prostego rozwiązania. Prawdopodobnie nie możesz zrobić nic lepszego niż ustawić pętlę na jednej zmiennej, powiedzmy x. Napraw x przy pewnej wartości całkowitej, a następnie rozwiązuj dla wszystkich y, które spełniają ograniczenia. Problem polega na tym, że może to zająć trochę wysiłku, wystarczy pokazać, że gdy dojdziesz do punktu, w którym nie ma rozwiązań dla y dla danego x, to nie ma większej wartości x, która może jeszcze przynieść dalsze rozwiązania. Arytmetyka międzywymiarowa może pomóc w tym aspekcie. –