Dies ist sicherlich nicht möglich, für einen allgemeinen Satz von Polynom Ungleichheiten im Allgemeinen zu tun, durch ein anderes Verfahren als enumerative suchen, auch wenn es eine endliche Anzahl von Lösungen. (Vielleicht sollte ich sagen, nicht trivial, wie es möglich ist. Enumerative Suche funktioniert, abhängig von Gleitkomma-Problemen.) Beachten Sie, dass der Interessenbereich nicht einfach für Ungleichungen höherer Ordnung verbunden sein muss.
Bearbeiten: Das OP hat gefragt, wie man eine Suche durchführen könnte.
Betrachten Sie das Problem
x^3 + y^3 >= 1e12
x^4 + y^4 <= 1e16
x >= 0, y >= 0
für alle ganzzahligen Lösungen dieses Systems lösen. Beachten Sie, dass Integer-Programmierung in JEDER Form hier nicht ausreicht, da ALLE Integer-Lösungen angefordert werden.
Die Verwendung von Meshgrid würde uns zwingen, Punkte in der Domäne (0: 10000) X (0: 10000) zu betrachten. Es würde uns also zwingen, eine Reihe von 1e8-Punkten zu testen und jeden Punkt zu testen, um zu sehen, ob sie die Beschränkungen erfüllen.
Eine einfache Schleife kann möglicherweise effizienter sein, obwohl es immer noch einige Anstrengungen erfordern wird.
% 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
Die Zeit, die erforderlich war ...
Elapsed time is 0.600419 seconds.
Von den 100.020.001 Kombinationen, die wir für getestet haben könnte, wie viele Lösungen fanden wir?
size(xy)
ans =
2 4371264
Zugegeben, die erschöpfende Suche ist einfacher zu schreiben.
tic
[x,y] = meshgrid(0:10000);
k = (x.^3 + y.^3 >= 1e12) & (x.^4 + y.^4 <= 1e16);
xy = [x(k),y(k)];
toc
I lief dies auf einer 64-Bit-Maschine mit 8 gig RAM. Aber selbst der Test selbst war ein CPU-Schwein.
Elapsed time is 50.182385 seconds.
Beachten Sie, dass Gleitkommaüberlegungen manchmal dazu führen, dass je nach Ausführung der Berechnungen eine andere Anzahl von Punkten gefunden wird.
Wenn Ihre Abhängigkeitsbedingungen komplexer sind, müssen Sie möglicherweise im Ausdruck für die Grenzen von y Wurzeln verwenden, um festzustellen, wo die Bedingungen erfüllt sind. Das Schöne daran ist, dass es immer noch für kompliziertere Polynomgrenzen funktioniert.
@woodchips, ist es nicht möglich, und es gibt auch keinen Algorithmus? – Graviton
@Ngu: Ich denke, dass eine der Implikationen eines Problems unmöglich ist, dass es keinen Algorithmus geben kann, um es zu lösen. Ich stimme @woodchips zu. Wenn Sie dies bezweifeln, schreiben Sie mit Stift und Papier die ersten paar (x, y) Paare auf, die Ihre Ungleichungen befriedigen. Dann halte für eine Weile inne und denke nach. –
Für das allgemeine Problem, NEIN, gibt es keine einfache Lösung. Sie können wahrscheinlich nicht besser als eine Schleife auf eine Variable einrichten, sagen wir x. Fixiere x auf einen ganzzahligen Wert und löse dann alle y, die die Bedingungen erfüllen. Ein Problem ist, dass es einige Anstrengungen erfordern kann, um zu zeigen, dass, sobald Sie zu einem Punkt kommen, dass es keine Lösungen für y für ein gegebenes x gibt, dass es keinen größeren Wert von x gibt, der noch weitere Lösungen ergeben könnte. Intervallarithmetik könnte bei diesem Aspekt hilfreich sein. –