电阻器串联等效公式:
串联等效=和(电阻)
对于并联,它是1/(和(1/电阻[i]))
我编写代码返回一个电阻列表,该列表最接近列表中指定的目标值,在指定的公差范围内
percentage_difference = lambda xi,xf: 100*(xf-xi)/xi
def series_equivalance(R,target,tolerance):
"""
R = list of resistors present
target = target value
tolerance = range += % of target that is acceptable
This function returns a list of resistors
"""
tol = tolerance/100 #converting tolerance to decimal
if target < min(R):
return "Your target is too small for series equivalence, Try parallel equivalence"
else:
r = R #dummy/copy R
toriginal = target #dummy values for arguments made to not change arguments
approximate = 0 #this is for exit condition, target in and of itself could be used but that would make algo unstable
resistors_list = [] #list to return at the end
while True: #Infinite loop because multiple exit conditions
if (approximate >= (1-tol)*target and approximate <= (1+tol)*target) :#exit condition
break
if len(R) == 0: #If all values are used up
return "All values used up, list: {}, approximate: {}".format(resistors_list,series_sum(resistors_list))
difference_from_target = [abs(toriginal-i) for i in R] #finding absolute difference of target from list of R values
for i,v in enumerate(difference_from_target):
if v == min(difference_from_target): #adding lowest differences to list
approximate += r[i] #increment approximate by value from resistors with least difference
toriginal -= r[i] #remove that from target dummy target
resistors_list.append(r[i]) #adding to list to be returned
r.remove(r[i])
break
return "Resistors to use are {}, Approximated value: {}, %Δ of {}%".format(resistors_list,sum(resistors_list),percentage_difference(target,int(sum(resistors_list))))
例如series_equivalance([1,2,3,4,5],7,0)
将返回[5,2]
我想要一个函数,可以做同样的并行等价。我该怎么做呢
编辑:我制作了一个blog post,它扩展了mip解决方案,可以求解满足公差的最小电阻
我用两种方法解决了这个问题
使用函数并向其提供反向值
这是一个中间解决方案,只需为电阻器输入1/R 值,并使其目标电阻为1/target。 然后,取结果的倒数,得到电阻值。 不能正确使用公差值。需要注释掉 “你的目标太小”检查它是否有效
print(parallel_equivalance([1, 2, 3, 4, 5, 6, 7], 1.5555, 1e-2))
给出Resistors to use are [5, 2], Approximated value: 7, %Δ of 0.0%
使用混合整数线性规划
对于这种方法,我使用一个混合整数线性规划来选择 要使用的电阻器,以便(1/r1+1/r2+…)尽可能接近 尽可能达到1/目标。即使在给定的情况下,也能快速求解(<;1s) 一万个电阻器可供选择
您可以对此进行修改,以选取最少数量的电阻器 (最小化
sum(R_in_use)
)的约束 错误值必须在一定范围内(例如,error >= -eps
和error <= +eps
)你需要
pip install mip
相关问题 更多 >
编程相关推荐