无需计算机的计算
我曾介绍过许多不同类型的软件,它们旨在帮助您进行各种类型的科学计算,但我忽略了一整类如今已很少使用的计算工具。在电子计算机出现之前,计算必须手工完成,因此容易出错。为了尽量减少人为错误,人们开发了各种形式的快捷方式和辅助工具。
一个常见的计算问题是求解多个变量的方程。为此类问题开发的工具是列线图或诺模图。列线图使用方程的图形表示,使求解方程就像放下直尺并读出结果一样简单。一旦构建了列线图,它就是手工求解方程的最快方法之一。
在本文中,我将探讨一些常见的列线图,你们中的许多人可能已经见过,并且我将介绍一个 Python 包 PyNomo,您可以使用它来创建自己的列线图。我还将逐步创建一些新的列线图,希望能激发您也尝试创建一些。
首先,让我解释一下列线图实际上是什么。电气工程师应该已经见过并使用过一个例子,即史密斯圆图。该图提供了一种非常快速的方法来解决与传输线和匹配电路相关的问题。手工解决这些类型的问题非常繁琐且浪费大量时间,因此史密斯圆图的引入极大地提高了生产力。

图 1. 使用史密斯圆图,您可以处理有关传输线和电路匹配的问题。
史密斯圆图以归一化阻抗或归一化导纳或两者兼而有之进行缩放。外围的刻度以波长和度数表示。波长刻度测量发生器和负载之间沿传输线的距离。度数刻度测量该点电压反射系数的角度。由于阻抗和导纳随频率变化而变化,因此您一次只能解决一个频率的问题。在一个频率下计算的结果是史密斯圆图上的一个点。对于更宽带宽的问题,您只需求解多个频率即可获得整个范围内的行为。但是,因为这并非电气工程课程,所以我将其作为读者的练习,看看使用史密斯圆图可以解决多少其他问题。
另一个例子,任何家长都应该认识到,是医生使用的身高/体重图表。这些图表允许医生获取儿童的体重和身高,并查看他在非线性刻度上的位置,该刻度将一个孩子与人口的可用统计数据进行非常快速的比较。这比将这些值代入方程并尝试手动计算要容易得多。
但是,如果您想使用全新的列线图类型,该怎么办呢? 请使用 Python 模块 PyNomo。安装 PyNomo 最简单的方法是使用 pip。您需要输入
pip install PyNomo
如果您想将其作为系统模块安装,您可能需要在该命令前加上 sudo
。要开始使用,您需要从 nomographer 部分导入所有内容,使用
from pynomo.nomographer import *
此部分包含主要的 Nomographer 类,该类实际生成您要创建的列线图。您可以使用 PyNomo 创建十种类型的列线图
-
类型 1:三条平行线
-
类型 2:N 或 Z 形
-
类型 3:N 条平行线
-
类型 4:比例
-
类型 5:等高线
-
类型 6:阶梯形
-
类型 7:角度
-
类型 8:单刻度
-
类型 9:通用行列式
-
类型 10:一条曲线
每种类型也由各种元素之间的数学关系描述。例如,类型 1 列线图由以下关系描述
F1(u1) + F2(u2) + F3(u3) = 0
给定列线图的每个元素都必须是一种类型或其他类型。但是,它们可以混合在一起作为完整列线图的单独元素。一个简单的例子,借用自主网站上的 PyNomo 示例,是用于在摄氏度和华氏度之间转换温度的温度转换器。它由两个类型 8 块生成。每个块都由一个参数对象定义,您可以在其中设置最大值和最小值、标题和刻度级别以及其他几个选项。从 –40 度到 90 度华氏度的刻度块如下所示
F_para={'tag':'A',
'u_min':'-40.0,
'u_max':'90.0,
'function':lambda u:celcius(u),
'title':r'$^\circ$ F',
'tick_levels':4,
'tick_text_levels':3,
'align_func':celcius,
'title_x_shift':0.5
}
您将需要一个类似的参数列表用于摄氏度刻度。获得该列表后,您需要为每个刻度创建块定义,如下所示
C_block={'block_type':'type_8',
'f_params':C_para }
最后一步是为主 Nomographer 类定义一个参数列表。对于温度转换器,您可以使用如下内容
main_params={'filename':'temp_converter.pdf',
'paper_height':20.0,
'paper_width':2.0,
'block_params':[C_block,F_block],
'transformations':[('scale paper')]
}
现在您可以使用 Python 命令创建您正在处理的列线图
Nomographer(main_params)

图 2. 一个简单的列线图是摄氏度-华氏度温度转换刻度。
一个更复杂的例子是一个列线图,用于帮助进行天文导航中涉及的计算。要处理如此复杂的问题,您需要使用类型 9 列线图。这种类型是完全通用的形式。您需要定义行列式形式来描述所有各种交互。如果组成部分是一个变量的函数,它们将创建一个常规刻度。如果它们是两个变量的函数,它们将创建一个网格部分。例如,此示例中的一个单刻度如下所示
'g':lambda u:-cos(u*pi/180.0)
而网格由以下定义
'g_grid':lambda u,v:-sin(u*pi/180.0)*sin(v*pi/180.0)

图 3. 您甚至可以使用列线图完成像天文导航这样复杂的事情。
一旦构建了此列线图,您就可以使用它来计算高度方位角。
PyNomo 在生成列线图时经历了几个步骤。最后一步是将任何变换应用于各个部分。对各个组件的变换只能应用于类型 9 列线图。如果您确实对各个组件应用变换,则需要确保各个部分之间的相对缩放仍然正确。对于其他列线图类型,变换只能应用于整个列线图。目前可用的变换数量不多,但足以处理您可能想要进行的大多数自定义。可用的变换是
-
缩放纸张:将列线图缩放到由 paper_height 和 paper_width 定义的尺寸。
-
旋转:将列线图旋转给定的度数。
-
多边形:对各种刻度的顶部和底部应用扭曲变换。
-
优化:尝试根据纸张面积以数值方式优化轴的平方长度之和。
通过这些变换,您应该能够获得您想要的列线图外观。
现在您了解了列线图,更重要的是,了解了如何制作它们,您真的没有理由避免去那个与世隔绝的南太平洋岛屿旅行了。继续玩 PyNomo,看看您还能制作和使用哪些其他类型的列线图。