python - CVXPY 有办法将变量约束为偶数吗?

标签 python python-3.x cvxpy

我正在尝试编写一个搜索时钟频率和除数的程序来生成目标频率。 然而,一个限制是除数必须是偶数(由于硬件限制),我找不到一种方法来对此进行建模。

我没有得到模运算符支持

"TypeError: unsupported operand type(s) for %: 'Variable' and 'int'"

以下使用除法和乘法的黑客尝试不起作用:

wantipp = cp.Parameter(name = 'wantedipp')  # Desired IPP

div = cp.Variable(integer = True, name = 'div') # Divisor must be integral
ipp = cp.Variable(pos = True, name = 'ipp') # nsec
constraints = [
        ipp == 1e9 / 6e6 * div,     # Constrain IPP to divisor
        div >= 2, div <= 65536,     # Divisor must be 2-65536
        div / 2 * 2 == div,         # Divisor must be even (doesn't actually work)
        ]
objective = cp.Minimize(cp.abs(ipp - wantipp))  # Find closest possible IPP
prob = cp.Problem(objective, constraints);

for i in (1e3, 2e3, 1e6, 2e6, 123123, 5412341, 1233, 12541):
    wantipp.value = i
    prob.solve()
    print('IPP %.3f nsec (%.3f Hz) -> Divisor %d %.3f nsec (%.3f Hz)' % (
          i, 1e9 / i, div.value, ipp.value, 1e9 / ipp.value
          ))

IPP 1000.000 nsec (1000000.000 Hz) -> Divisor 6 1000.000 nsec (1000000.000 Hz)
IPP 2000.000 nsec (500000.000 Hz) -> Divisor 12 2000.000 nsec (500000.000 Hz)
IPP 1000000.000 nsec (1000.000 Hz) -> Divisor 6000 1000000.000 nsec (1000.000 Hz)
IPP 2000000.000 nsec (500.000 Hz) -> Divisor 12000 2000000.000 nsec (500.000 Hz)
IPP 123123.000 nsec (8121.959 Hz) -> Divisor 739 123166.667 nsec (8119.080 Hz)
IPP 5412341.000 nsec (184.763 Hz) -> Divisor 32474 5412333.333 nsec (184.763 Hz)
IPP 1233.000 nsec (811030.008 Hz) -> Divisor 7 1166.667 nsec (857142.857 Hz)
IPP 12541.000 nsec (79738.458 Hz) -> Divisor 75 12500.000 nsec (80000.000 Hz)

即它最终得到除数 739 等。

(请注意,我从固定时钟开始,稍后它会改变)

我在 MacOSX 10.14.6 上使用 CVXPY 1.0.25Python 3.7.5

最佳答案

创建约束为偶数的变量 x 的完全标准方法是添加整数变量 y 和约束 x=2y。

关于python - CVXPY 有办法将变量约束为偶数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59150061/

相关文章:

python - 如何使 pandas 分类堆积条形图比例达到 100%

python - 使用 OpenCV 4.5.1 打开 VideoStream 可在 Windows 上运行,但在 Docker python :3. 9.2-slim-buster 上针对特定 IP cam 失败

python - 在 Python 3 中查找唯一不可散列的不可排序类型的最佳方法是什么

python-3.x - 将两个数据帧相加以获得相等的条目

python - 尝试用 cvxpy 解决数独问题

mathematical-optimization - 使用 CVXPY 解决具有条件最小组大小的分配问题

Python CVXPY kronecker 产品尺寸

python - 无法 pickle : attribute lookup builtin. 功能失败

python - 如何在 Python 中使用 conda/meta.yaml 指定外部软件需求?

python-3.x - NLTK-属性错误: module 'nltk' has no attribute 'data'