我有一些关于 {x,y}, ,满足以下方程式:

x>=0
y>=0
f(x,y)=x^2+y^2>=100
g(x,y)=x^2+y^2<=200

注意 xy 必须是整数。

从图形上可以说明如下,蓝色区域是满足上述不平等的区域:

alt text

现在的问题是,MATLAB中是否有任何功能可以找到每对可允许的一对 {x,y}?如果有算法要做这种事情,我也很高兴听到它。

当然,我们始终可以使用一种方法是蛮力方法,我们在其中测试了所有可能的组合 {x,y} 查看是否满足不平等现象。但这是最后的手段,因为它很耗时。我正在寻找一种可以执行此操作的巧妙算法,或者在最好的情况下,我可以直接使用的现有库。

x^2+y^2>=100 and x^2+y^2<=200 只是例子;事实上 fg 可以是任何程度的任何多项式函数。

编辑:C#代码也受到欢迎。

有帮助吗?

解决方案

通常,除枚举搜索以外的任何方法,即使有有限数量的解决方案,这肯定是不可能的。 (也许我应该说不是很重要。

编辑:OP询问了如何继续进行搜索。

考虑问题

x^3 + y^3 >= 1e12
x^4 + y^4 <= 1e16

x >= 0, y >= 0

解决该系统的所有整数解决方案。请注意,以任何形式的整数编程都不足够,因为请求所有整数解决方案。

Meshgrid的使用将迫使我们查看域中的点(0:10000)x(0:10000)。因此,这将迫使我们采样一组1E8点,测试每个点以查看它们是否满足约束。

一个简单的循环可能比这更有效,尽管它仍然需要一些努力。

% 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

所需的时间是...

Elapsed time is 0.600419 seconds.

在我们可能已经测试的100020001组合中,我们找到了多少个解决方案?

size(xy)
ans =
           2     4371264

诚然,详尽的搜索更简单地编写。

tic
[x,y] = meshgrid(0:10000);
k = (x.^3 + y.^3 >= 1e12) & (x.^4 + y.^4 <= 1e16);
xy = [x(k),y(k)];
toc

我在64位机器上运行了这件,并带有8次RAM。但是即便如此,测试本身就是CPU猪。

Elapsed time is 50.182385 seconds.

请注意,浮点注意事项有时会导致不同数量的点,具体取决于如何完成计算。

最后,如果您的约束方程式更为复杂,则可能需要在y上的界限中使用词根,以帮助确定满足约束的位置。这里的好处是,它仍然适用于更复杂的多项式界限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top