找到满足条件的参数化答案的最小值

时间:2017-12-04 02:21:03

标签: matlab

我想找到满足ll^2 >= x的最小整数mod(l,2)=0

在以下示例x=75中,因此l=10,因为上一个偶数不能满足不等式:8^2 <= 75 <= 10^2

我试过这个(忽略偶数要求,我无法工作):

syms l integer
eqn1 = l^2 >= 75;
% eqn2 = mod(l,2) == 0;
[sol_l, param, cond] = solve(eqn1, l, 'ReturnConditions', true);

但这并没有直接给我任何帮助:

sol_l =
k
param =
k
cond =
(75^(1/2) <= k | k <= -75^(1/2)) & in(k, 'integer')

我想评估参数的条件并找到满足条件的最小值。

另外,我想以某种方式强制执行mod(l,2)=0条件,但我似乎无法完成这项工作。

2 个答案:

答案 0 :(得分:2)

我想没有使用不等式和solve函数的最简单的解决方案是找到等式l^2 >= x的精确解,然后找到下一个偶数整数。代码如下所示:

x = 75;

y = ceil(sqrt(x)); %Ceil finds the next bigger integer

if(~mod(y,2))   %If it's even, we got the solution
    sol = y;
else            %If not, get the next integer
    sol = y+1;
end

前面的代码为所提供的示例提供了正确的解决方案(x = 75; sol = 10)

答案 1 :(得分:2)

使用solve执行此任务就像使用大炮杀死蚊子一样。实际上,Lidia Parrilla的答案是好的和快速的,尽管它可以简化如下:

l = ceil(sqrt(x));

if (mod(x,2) ~= 0)
    l = l + 1;
end

% if x = 75, then l = 10

但我想指出一些其他人没有注意到的事情。 solve l^2 >= 75函数为75^(1/2) <= k | k <= -75^(1/2) 提供的条件为:

l

并且它绝对正确。由于x = 75被提升到2的幂,并且由于负数增加到2的幂会产生正数,因此等式总是有两个不同的解:负数和正数。

对于l = 10,解决方案将为l = -10l = ceil(sqrt(x)); if (mod(x,2) ~= 0) l = l + 1; end l = l * -1; 。所以,如果你想找到最小的数字(负数总是小于正数),那么正确的解决方案将是:

l_pos = ceil(sqrt(x));

if (mod(x,2) ~= 0)
    l_pos = l_pos + 1;
end

l_neg = l_pos * -1;

l = [l_neg l_pos];

如果要返回两个解决方案,结果将是:

v1 <- c(1, 2, 3, 4, 1, 3, 5, 6, 4)
v2 <- c(1, 2, 3, 4, 5, 6, 7)