我想找到满足l
和l^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
条件,但我似乎无法完成这项工作。
答案 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 = -10
和l = 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)