快速找出满足所需比值的一对电阻值 - Python 函数实现

这篇具有很好参考价值的文章主要介绍了快速找出满足所需比值的一对电阻值 - Python 函数实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常用的5% 和1% 精度电阻的阻值满足E24 数系,基数只能在这个数系里取,再乘上10 的n 次幂。E24 数系如下图:

快速找出满足所需比值的一对电阻值 - Python 函数实现
之前我都是人肉一个一个试的,凭运气挑,终于忍不住想整个一劳永逸的小工具。

代码

对于给定的比值,用一个python 函数暴力搜索,将所有正好满足比值的组合全部输出,如果没有正好等于的,就只返回一个偏差最小的组合,代码如下:

from typing import List, Tuple

def find_e24_resistor_pair(target_ratio: float) -> List[Tuple[float, float, float]]:
    """
    在 E24 优先数系中找到两个电阻值,使它们的比值最接近给定的比值。
    如果有多个解,返回所有较小值不相等且在 1~10 范围内的解。
    如果没有精确匹配的解,返回偏差最小的一组解。
    每个解都是一个三元组 (r1, r2, diff),其中 r1 和 r2 是电阻值,diff 是偏差。

    :param target_ratio: 目标比值
    :return: 电阻值组合列表
    """
    e24 = [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7,
            3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8,
            7.5, 8.2, 9.1]
    result = []
    min_diff = float('inf')
    epsilon = 1e-9
    min_exponent = math.floor(math.log10(e24[0] * target_ratio))
    max_exponent = min_exponent + 1
    for r2 in e24:
        for r1_base in e24:
            for i in range(min_exponent, max_exponent + 1):
                r1 = r1_base * (10 ** i)
                ratio = r1 / r2
                diff = abs(ratio - target_ratio)
                if diff < epsilon:
                    result.append((r1,r2,diff))
                elif diff < min_diff:
                    min_diff = diff
                    min_result = (r1,r2,diff)
    if len(result) == 0:
        result.append(min_result)

    return result

这个函数的搜索过程是:先把分子r2 的取值范围固定在10 的0 次幂,也就是1.1, 1.2, … 9.1 这些E24 数系的基数,然后根据给定的比值,计算分母r1 的搜索范围,最后依次遍历分子和分母的所有取值组合。比如,若比值为5,分子最小值为1.0,最大9.1,则分母的取值范围是5 ~ 45.5,也就是10 的0 次幂到1 次幂,而且很显然,无论比值有多大,分母的最大值和最小值最多只能差一个数量级。

如果目标比值为3,这个函数会返回一个列表,里面是精确匹配的四个组合3 / 1、3.3 / 1.1 、3.6 / 1.2、3.9 / 1.3:

[
 (3.0, 1.0, 0.0), 
 (3.3, 1.1, 4.440892098500626e-16),
 (3.6, 1.2, 0.0),
 (3.9, 1.3, 0.0)
]

每组返回三个数字,第三个是偏差的绝对值。其中3.3 / 1.1 有点特殊,偏差并不等于0,这是因为浮点数的精度问题,如下:

>>> 3.3 / 1.1
2.9999999999999996

这个比值并不等于3。所以判断两个浮点数是否相等,不能像整数一样直接比较,而是要把两个浮点作差,如果差值足够小,就判断是相等。上面代码中的变量epsilon 就是这个足够小的差值,1e-9,偏差小于这个值就当0 来看。如果所需的比值为33.55,函数的返回结果是:

[(91.0, 2.7, 0.15370370370370523)]

没有正好匹配的组合,最接近的组合是91 / 2.7。偏差的绝对值是0.1537,误差比例是0.4591%,考虑到实际电阻值本身的误差也有1%,所以这个组合可以接受。再顺便加一个函数,直接把返回结果打印出来,方便使用:

def print_resistor_pair(target_ratio: float):
    resistors = find_e24_resistor_pair(target_ratio)
    if len(resistors) == 1 and resistors[0][2] > 1e-9:
        diff_ratio = resistors[0][2] / (target_ratio) * 100
        print(f"没有两个电阻值的比值等于 {target_ratio:.2f},但是电阻值 {resistors[0][0]:.2f}{resistors[0][1]:.2f} 的比值最接近,误差为 {diff_ratio:.4f}%")
    else:
        print(f"在 E24 数系中,以下电阻值组合的比值等于 {target_ratio:.2f}:")
        for r1, r2, _ in resistors:
            print(f"{r1:.2f}, {r2:.2f}")

如果参数是33.55,调用后会输出:

>>> print_resistor_pair(33.55)
没有两个电阻值的比值等于 33.55,但是电阻值 91.002.70 的比值最接近,误差为 0.4581%

GUI 窗口

再实现一个简单的GUI 吧,方便用:

快速找出满足所需比值的一对电阻值 - Python 函数实现

完整代码如下,保存为.pyw格式的文件,然后双击运行:

import tkinter as tk
import io
import sys

from typing import List, Tuple


def find_e24_resistor_pair(target_ratio: float) -> List[Tuple[float, float, float]]:
    """
    在 E24 优先数系中找到两个电阻值,使它们的比值最接近给定的比值。
    如果有多个解,返回所有较小值不相等且在 1~10 范围内的解。
    如果没有精确匹配的解,返回偏差最小的一组解。
    每个解都是一个三元组 (r1, r2, diff),其中 r1 和 r2 是电阻值,diff 是偏差。

    :param target_ratio: 目标比值
    :return: 电阻值组合列表
    """
    e24 = [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7,
            3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8,
            7.5, 8.2, 9.1]
    result = []
    min_diff = float('inf')
    epsilon = 1e-9
    min_exponent = math.floor(math.log10(e24[0] * target_ratio))
    max_exponent = min_exponent + 1
    for r2 in e24:
        for r1_base in e24:
            for i in range(min_exponent, max_exponent + 1):
                r1 = r1_base * (10 ** i)
                ratio = r1 / r2
                diff = abs(ratio - target_ratio)
                if diff < epsilon:
                    result.append((r1,r2,diff))
                elif diff < min_diff:
                    min_diff = diff
                    min_result = (r1,r2,diff)
    if len(result) == 0:
        result.append(min_result)

    return result


def print_resistor_pair(target_ratio: float):
    resistors = find_e24_resistor_pair(target_ratio)
    if len(resistors) == 1 and resistors[0][2] > 1e-9:
        diff_ratio = resistors[0][2] / (target_ratio) * 100
        print(f"没有两个电阻值的比值等于 {target_ratio:.2f},但是电阻值 {resistors[0][0]:.2f}{resistors[0][1]:.2f} 的比值最接近,误差为 {diff_ratio:.4f}%")
    else:
        print(f"在 E24 数系中,以下电阻值组合的比值等于 {target_ratio:.2f}:")
        for r1, r2, _ in resistors:
            print(f"{r1:.2f}, {r2:.2f}")


def on_submit(event=None):
    value_str = entry.get()
    if not value_str:
        return
    text.tag_remove("highlight", "1.0", "end")
    try:
        value = float(value_str)
    except ValueError:
        text.insert(tk.END, "错误:请输入一个有效的浮点数\n")
        text.tag_add("highlight", "end-2l linestart", "end-1l lineend")
        text.yview_moveto(1)
        return
    # 重定向标准输出到字符串缓冲区
    sys.stdout = io.StringIO()
    print_resistor_pair(value)
    # 获取缓冲区中的文本并显示在文本框中
    s = sys.stdout.getvalue()
    text.insert(tk.END, s)
    line_count = s.count('\n')
    text.tag_add("highlight", f"end-{line_count + 1}l linestart", "end-1l lineend")
    text.yview_moveto(1)
    # 恢复标准输出
    sys.stdout = sys.__stdout__

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
label = tk.Label(frame, text="输入一个参数")
label.pack(side=tk.LEFT)
entry = tk.Entry(frame)
entry.pack(side=tk.LEFT)
entry.bind("<Return>", on_submit)
entry.focus_set()
submit = tk.Button(frame, text="计算", command=on_submit)
submit.pack(side=tk.LEFT)
text = tk.Text(root)
text.pack()
text.tag_config("highlight", background="yellow", foreground="red")
text.tag_config("gray", foreground="gray")
root.mainloop()

总结

性能大概算不上快速,但是能用,而且这种寻找最优组合的问题,基本上也只有暴力搜索这一条路可走吧。文章来源地址https://www.toymoban.com/news/detail-423320.html

到了这里,关于快速找出满足所需比值的一对电阻值 - Python 函数实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搜索引擎爬虫技巧:快速获取所需信息!

    现代社会,信息爆炸式增长,各行各业都需要大量的数据支持。而搜索引擎则成为了人们获取信息的主要途径。但是,人工搜索对于海量数据的处理速度和效率都无法满足需求。这时候,基于搜索引擎爬取资源就成为了一种重要的方式。本文将从多个方面详细介绍如何利用爬

    2024年02月05日
    浏览(40)
  • 如何用手机快速获得真人手办所需的人像模型

    伴随网络生活覆盖面的增大,越来越多的领域需要三维模型 ,比如最近爆火的真人手办就必须用到人像模型 。 真人手办的制作过程其实非常简单,在专门搭建的摄影棚内进行全身3D扫描,获得3D人体模型,然后进行修模,最后3D打印出来,一个真人手办就诞生了。 想快速做一

    2024年02月11日
    浏览(628)
  • 2、电路综合原理与实践---正实函数与策动电阻抗函数

    需要先了解有一个拉普拉斯变换。其公式如下所示: 拉普拉斯变换公式能够将时域信号变换到频域,自然而然,它可以将电压、电流的时域波形变换到频域。即: v(t) - V(s) i(t) - I(s) 然后就可以得到策动点阻抗的表达式(p和s代表的是一个东西,简单来说就是电压除以电

    2024年02月07日
    浏览(45)
  • OpenCV minMaxLoc()函数找出图像中最小值最大值

    OpenCV 找出图像中最小值最大值函数minMaxLoc的使用 功能:从一个矩阵中找出全局的最大值和最小值。 函数cv::minMaxLoc找出最大和最小元素的值和他们的位置。极值是遍历整个矩阵找到,或者当掩码不是一个空矩阵时,是通过遍历指定矩阵区域找到。 函数不适用于多通道矩阵,

    2024年02月08日
    浏览(49)
  • 在stm32中,所需的库函数有那些

    使用库函数中封装的函数来访问外设可以使得stm32开发更加方便,省去了查寄存器位操作,只用查库函数就可以了 但是使用库函数时要记住真正的其本质是获取寄存器的地址然后设置其中的位 库函数一般添加到自己创建的Lib文件夹中 库函数实际上分成了两块,分别是CSMIS和标

    2024年04月26日
    浏览(37)
  • idea 插件 Easy Code 自定义 MybatisPlus 模板一键快速生成所需代码

    之前无意中了解到了 idea 中的 Easy Code 插件,说是能快速生成 entity 、mapper、service、controller 等文件,避免很多简单重复性的创建工作,大大提高 MySQL 增删改查的开发效率。 正好今天要做对 MySQL 的增删改查,想着试试这个插件,没想到,特别好用,但也需要自己定制,所以就

    2023年04月20日
    浏览(51)
  • Cloudera的Hadoop快速入门指南将带你掌握Hadoop所需的知识。

    作者:禅与计算机程序设计艺术 Cloudera(隶属于Apache基金会)是一个领先的开源分布式计算平台,其创始人之一 在2010年被任命为该项目的CEO,他以“让数据更具价值”为使命,帮助企业构建高度可靠、可扩展、高可用的数据处理系统。通过提供全面而统一的分布式计算框架

    2024年02月08日
    浏览(38)
  • chatgpt赋能python:Python如何快速找到函数

    作为一名有10年Python编程经验的工程师,我深知在Python编程过程中如何快速找到函数是非常重要的。在学习和掌握Python函数之前,首先需要学会如何快速地找到所需的Python函数。这篇文章将介绍一些我在编程中经常使用的方法,希望能帮助Python初学者快速找到所需的函数。 使

    2024年02月08日
    浏览(59)
  • Leecode找出字符串中第一个匹配项的下标 即实现strSTR()函数

    目录 简单介绍该函数的作用         在我们去用查找微信或者qq聊天记录的时候,我们总不能一句一句去找吧。我们需要用到的功能底层大概是此博客所讲的这个函数熬。 一.算法需要传入的参数和返回类型         需要传入的就是和所有的文本,返回的是当前

    2024年02月12日
    浏览(56)
  • EXCEL按列查找,最终返回该列所需查询序列所对应的值,VLOOKUP函数

    EXCEL按列查找,最终返回该列所需查询序列所对应的值 示例:国标行业分类汉字,匹配id 使用VLOOKUP函数 第一参数:拿去查询的值。 第二参数:匹配的数据。 Ps:Sheet1!$C 21 : 21: 21 : E 117 ,需要固定住位置,所以使用 117,需要固定住位置,所以使用 117 ,需要固定住位置,所以

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包