【发布时间】:2019-12-03 04:07:36
【问题描述】:
我正在尝试编写对时钟频率和除数的搜索以生成目标频率。 然而,一个限制是除数必须是偶数(由于硬件限制),我找不到对此建模的方法。
我没有得到模运算符支持
"TypeError: % 的不支持的操作数类型:'Variable' 和 '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.25、Python 3.7.5。
【问题讨论】:
-
考虑在使用数字而不是约束的任何地方添加一个因子 2。例如。
objective = cp.Minimize(cp.abs(2 * ipp - wantipp) -
我刚刚想到了这个想法,它确实有效,但感觉很糟糕..
-
为什么?这在数学上是合理的。
-
试试
(div // 2) * 2 == div。/不会限制任何东西,因为它是真正的分歧。让我知道这是怎么回事,我会发布答案。 -
失败并显示“TypeError: unsupported operand type(s) for //: 'Variable' and 'int'”。我也尝试了“cp.floor(div / 2) * 2 == div”,但我收到了“floor(div / 2.0)”的 DCP 错误
标签: python python-3.x cvxpy