理论与实践?






4.85/5 (28投票s)
抽象数学理论在实践中的应用
- 下载源代码 3.6 MB
- 下载表格函数示例 - 8.2 KB
- 下载数值计算示例 - 5.5 KB
- 下载频域中传递函数的参数辨识 - 6.9 KB
- 下载频域中传递函数的参数辨识(实际函数) - 9 KB
- 下载人造地球卫星示例 - 1.5 MB
有用链接
1. 引言
数学教育的第一阶段是熟悉数字。然后引入了未知的“x”。我当时想:“为什么需要‘x’?只用数字还不够吗?”我的很多朋友也有类似的看法。我的一位同事也给我讲过一个类似的故事。然后他注意到我用符号 f 表示实变实值函数。他说:“你的表示法不正确。你应该用 f(x)。”我解释说,f 表示实际的函数,而 f(x) 是函数在自变量等于 x 时的值(f(x) 也被称为潜在函数)。 的确, 使用 f 是抽象的下一步。很多人说:“我不是理论家,我是实践者。”很多人告诉我他们是实践者。但“实践者”这个词本身并没有意义。于是我问人们:“谁是实践者?”我的民意调查得出了以下众所周知的答案列表:
- 我是一名工程师,所以我不需要面向对象的范式。(这位工程师在1995年还在使用ALGOL,他用了很多标签来代替“begin...end”结构。)
- 我没有时间进行理论学习。
- 我喜欢简单。(这个人不熟悉代码复用。)
- 高质量与快速开发是矛盾的。
任何优秀的IT专家都可以自己扩展这个反模式列表。我自己的观点是:“理论对实践很有用”。所以我在本文标题中加了一个“?”。我所有的文章都包含大量理论。本文的重点是理论的实用性。下面的故事证明了理论的应用可以节省时间。
我经常被同事指责:“你在读不相关的书。”我的一位同事多年来试图找到一个工程常微分方程的解析解。我告诉他,这种解的存在是一个非常偶然的事件。我读过 I. Kaplansky 的《微分代数》(Differential Algebra, Hermann, 1957)。粗略地说,这本书解释了解析解的存在是一个非常偶然的事件。那位同事回答我说这本书不相关。“我们不是数学家,我们是工程师。”他没有找到解析解。我不确定这个解是否有用,因为数值解只需要不到一秒钟的时间。很多同事告诉我他们非常忙,所以不读高深的书。他们说我有很多时间,所以我读了很多书。然而,我不会在无用的任务上花费时间。也许阅读高深的书可以节省时间?
2. 背景
严谨的数学具有简洁、明确和上下文依赖的特点。下面符号的含义
在下表中列出
N | 元素 | 类型 |
1 | f, g | 实变实值函数 |
2 | a | 实数 |
3 | v | 维度为 n 的实向量 |
我的朋友认为“f(x)”中的“x”总是一个实数。然而,“x”也可以是一个向量或一个函数。下表展示了不同类型的“x”
在下表中列出
N | 自变量类型 | 表达式 | 含义 | 结果类型 |
1 | 实数 | f(a) | 当自变量等于 a 时 f 的计算结果 | 实数 |
2 | 实变实值函数 | f(g) | 函数 f 和 g 的复合 | 实变实值函数 |
1 | 维度为 n 的实向量 | f(v) | f 的按元素计算 | 维度为 n 的实向量 |
下面将展示应用该理论的示例。
3. 函数
3.1 基础接口
关于 f 和 f(x) 的讨论发生在1977年。那时很多工程师认为 FORTRAN 是最好的语言,理论对软件开发的用处并不明显。只有面向对象的范式才能很好地抽象表达函数。以下接口表示所有单变量函数的基础接口。
/// <summary> /// Function of one variable /// </summary> public interface IOneVariableFunction : IObjectOperation { /// <summary> /// Type of variable /// </summary> object VariableType { get; } } /// <summary> /// Operation which returns an object /// </summary> public interface IObjectOperation { /// <summary> /// Types of input parameters /// </summary> object[] InputTypes { get; } /// <summary> /// Calculates result of this operation /// </summary> /// <param name="arguments">Array of arguments</param> /// <returns>Operation result</returns> object this[object[] arguments] { get; } /// <summary> /// Return type /// </summary> object ReturnType { get; } }
以上接口是 IObjectOperation
接口的规范。IObjectOperation
是一个非常通用的接口,它通过一组参数计算一个对象。IOneVariableFunction
不总是实变实值函数。ReturnType
和 VariableType
属性分别是函数的返回类型和参数类型。
3.2 示例
3.2.1 显式公式
一组函数可以用显式公式表示。下面给出显式表达式的示例。
3.2.2 表格
科学和工程中使用的许多函数是通过实验定义的。这些函数是制成表格的。下面是一个表格函数的例子。
下图展示了表格函数的应用示例。
Chart 元素是一个表格。该表格的列是 X(横坐标)和 Y(纵坐标)。它有以下输出:
N | 参数 | 符号 | 类型 |
1 | X 值数组 | X | double[维度] |
2 | Y 值数组 | Y | double[维度] |
3 | X 值中的最小元素 | X_1 | double |
4 | Y 值中的最小元素 | Y_1 | double |
5 | X 值中的最大元素 | X_2 | double |
6 | Y 值中的最大元素 | Y_2 | double |
7 | 由表格定义的函数 f | 函数 | double f(double) |
下图展示了这些参数的用户界面。
下图展示了表格函数的演示应用程序。
对象 F、G 和 H 的属性如下所示:
F 只有一个公式 (Formula 1)。该公式只有一个变量 f。而变量 f 链接到 Graph 对象的 Double f(Double)
Function。G 对象有三个变量和两个输出公式。
N | 变量名 | 类型 | 注释 |
1 | f | Double f(Double) | F 的 Formula_1 |
2 | g | Double f(Double) | 来自 Chart 的函数 |
3 | t | 双精度浮点型 | 时间变量 |
N | 公式 | 类型 | 注释 |
1 | Formula_1 | 双精度浮点型 | 依赖于时间变量的函数的实数值 |
2 | Formula_2 | Double f(Double) | 函数 f 和 g 的复合 |
最后,H 对象有以下变量和输出公式:
<><>< />N | 变量名 | 类型 | 注释 |
1 | x | 双精度浮点型 | G 的 Formula_1 = Chart 函数在参数等于时间时的值 |
2 | f | Double f(Double) | G 的 Formula_2 = Chart 函数与 F 的 Formula_1 的复合 = Chart 函数与自身的复合 |
3 | t | 双精度浮点型 | 时间变量 |
N | 公式 | 类型 | 注释 |
1 | Formula_1 | 双精度浮点型 | x 的值 = Chart 函数在参数等于时间时的值 |
2 | Formula_2 | 双精度浮点型 | f(t) 的值,其中 f 是 Chart function 与自身的复合,t 是时间 |
下图表示 G 的 Formula_1 和 Formula_1。
红色和蓝色曲线分别是 Chart 函数以及 Chart 函数与自身复合的图表。请注意,此软件假定函数表格值的 X 轴范围等于零。
3.2.3 数值计算
有许多数学函数没有显式表达式。许多微分方程没有显式解。例如,二阶线性微分方程 y''+xy = 0(x 是自变量,'' 表示二阶全导数)没有显式解。《微分代数》(I. Kaplansky, “Differential Algebra”, Hermann (1957))一书包含了上述事实的证明。然而,数值计算可以得到这些函数。这里考虑 y''+xy = 0 的数值解。该微分方程等价于以下一阶微分方程组:
y' = z;
z' = -xy.
其中 z = y'。我们考虑上述系统的以下修改形式:
希腊字母 delta 表示狄拉克δ函数,k 和 a 是实常数。这个修改后的系统也没有显式解,但 δ 函数的存在使方程更有趣。下图表示上述系统的解。
Differential equation(微分方程)对象具有以下属性
其中变量 a 是 Input 的 Formula_1,如下所示
下图表示微分方程组的解。
红色和蓝色曲线分别代表 y 和 z。z 的跳跃是由狄拉克δ函数的存在以及 y 导数的跳跃引起的。因此,数值解可以得到必要的函数。然而,这个函数更像是 f(x) 而不是 f。它是一个潜在函数,即针对具体参数值的计算。但许多任务需要实际的 f,即作为全局的函数。例如,函数复合需要将函数视为全局对象。应用以下 Accumulator(累加器)组件可以得到实际的(全局的)f。
该组件具有以下变量:
Accumulator 与 Simulink 的 Transport Delay 非常相似。Accumulator 将 Differential equation 的潜在函数 y(t)、z(t) 转换为实际函数,即分别为 y 和 z。这些实际函数在 [0,1] 区间上进行数值计算。计算步长为 0.01,步数为 100。这些实际函数可以进行复合。Composition 组件产生这种复合。该组件的属性如下所示。
Composition 的变量如下所示:
N | 变量名 | 类型 | 注释 |
1 | f | Double f(Double) | Accumulator 的 Differential_equation_y = 作为实际函数的 Differential equation 的 y |
2 | g | Double f(Double) | Accumulator 的 Differential_equation_z = 作为实际函数的 Differential equation 的 z |
Composition 的输出是函数复合 f(g) 或 y(x),因为 Composition 的 f 和 g 分别是 Differential equation 的实际 y 和 z。复合结果如下所示。
- 下载此示例
4. 实践应用
以上示例与其说是实践性的,不如说是人为设计的。在此,我想证明理论对实践的用处。
4.1 频域中传递函数的参数辨识
这里是对《频域传递函数参数辨识》的一项综述。我们希望辨识以下三阶传递函数的参数:
假设频率响应是通过实验定义的。下图展示了辨识的思想。
我们希望得到常数 k, T1, T2, T3 的值,使得理论的频率响应依赖关系能够逼近实验值。实验值是上图中红色的叉。蓝色曲线是理论计算的频率响应。辨识得到了对实验数据的良好逼近。上述传递函数的频率响应和相位响应的理论依赖关系如下所示:
tan-1 和相位响应以度表示。因此,我们希望用上述频率响应公式来逼近实验数据。下图包含了该任务的解决方案。
Graph 元素包含以下实验得出的频率响应表。
该表的 X 和 Y 列分别对应频率和频率响应。Formula 组件包含以下回归公式:
上述公式是频率响应的显式表达式。该公式的参数 p 是一个向量(数组),即 Graph 的 X 坐标。因此,函数的参数不是实数,而是实向量。上述公式的常数与传递函数的参数对应关系如下:
N | 公式常数 | 传递函数参数 |
1 | k | k |
2 | a | T1 |
3 | b | T2 |
4 | c | T3 |
因此,上述公式表示理论频率响应。Processor 组件计算出 k, T1, T2, T1 (或者 Formula 中的 k, a, b, c) 的值,使得实验定义的频率响应值能被理论计算值逼近。Processor 组件的属性如下所示。
数字 0 对应于 Formula 的 Formula_1 和 Graph 的 Y。这意味着实验定义的频率响应值由理论值逼近。所有标记为 -1 的表达式在回归过程中不被考虑。然而,Formula 组件还有其他公式:
第一个公式是频率响应。但这个公式的参数是时间变量 t。第二个是相位响应。这些公式的应用是频率响应的指示。
频率响应的理论函数 f 被使用了两次。首先,它被用作 f(p),其中 p 是一个向量。其次,它被用作 f(t),其中 t 是一个(非恒定的)实数。对一个函数使用两个公式不是一个好主意。下图展示了使用单个函数的应用。
Formula 对象计算 f(t),其中 t 是时间变量。然后 Accumulator 从 f(t) 创建实际的 f。最后 F(X) 对象计算该函数应用于 Graph 对象的 X 坐标。F(X) 的属性如下所示:
4.2 人造地球卫星
这里考虑以下任务:
- 确定运动参数;
- 生成文本文档;
- 可视化;
- 音频支持。
所有这些任务都在不同上下文中使用运动参数作为时间函数。轨道确定使用向量值,可视化使用时间变量的函数。然而,所有这些任务都使用同一组参数。粗略地说,使用的是实际的 f 而不是潜在的 f(x)。
4.2.1 运动模型
航天器的运动模型已在此处描述。但我已复制文本以便于阅读。
人造卫星的运动模型是一个描述其在格林尼治参考系中运动的常微分方程组:
其中 分别是坐标和速度分量,
是地球的角速度,
是总外力的加速度分量。当前模型包含引力和气动力。这些加速度可由以下公式定义:

下表包含这些参数的含义:

常微分方程组件用于上述方程。该组件没有丰富的符号系统,只使用小写变量。但是,该组件支持丰富的注释系统,如下所示:

这些注释可以包含变量和物理参数之间的映射。方程的自变量(x、y、z、u、v、w)在右侧部分被勾选。这些变量与

该组件以下列方式表示微分方程:

除了自变量,方程还包含其他参数。下表包含了这些参数的映射关系。

其中一些参数是常量。其他参数需要导出。常量被勾选,而导出的参数未被勾选,如下所示:

导出的参数与引力和大气模型有关。这些模型包含在外部库中。下图包含了运动模型的组件。

Motion equations 组件是上面考虑的常微分方程组件。这些方程有反馈。方程的右侧部分取决于引力。反过来,引力又取决于卫星的坐标。Vector 组件被用作 Motion equations 的反馈。

此图具有以下含义。Vector 组件的变量 x、y、z、u、v、w 被分配给 Motion equations 的变量 x、y、z、u、v、w。Vector 的输入和输出参数如下所示。

组件 Gravity、Atmosphere 是从外部库中获得的对象,分别用于计算地球引力和地球大气。这两个对象都实现了 IObjectTransformer
接口。G-transformation 和 A-transformation 对象是辅助对象,分别用于应用 Gravity 和 Atmosphere 对象。G-transformation 的属性如下所示。

上图的含义如下。G-transformation 连接到 Gravity 对象。该对象对应于导出的 Gravity
类(Gravity
类的代码在本文上方)。Gravity
类实现了 IObjectTransformer
接口。Gravity
的输入参数是坐标,分别用 "x", "y", "z" 标签标记。因此,上面的组合框也用 x", "y", "z" 标签标记。上图表示参数 x", "y", "z" 被分配给 Vector 组件的 Formula_1, Formula_2, Formula_3。反过来,Vector 的 Formula_1, Formula_2, Formula_3 被分配给 Motion equations 的 x, y, z。然而,Motion equations 组件使用了 G-transformation 的参数。

此图表示 Motion equations 的参数 a, b, c 被分配给 G-transformation 的参数 Gx, Gy, Gz。因此,地球的 Gravity
函数被导出到 G-transformation。地球大气层以类似的方式导出。
4.2.2 轨道确定
下图说明了轨道确定的问题。

我们有一颗人造地球卫星。有一组地面站进行测量。因此,我们有站与卫星之间的距离和相对速度的测量值。处理这些测量值可以确定轨道。
4.2.2.1 输入数据
输入数据包含距离和相对速度的测量值。为此使用了专门的组件。这些组件如下所示:

Distance 组件的纵坐标是测量的距离,Velocity 组件的纵坐标是测量的相对速度。这些组件的横坐标无关紧要。其他输入数据如下所示:

输入参数的完整列表如下表所示:
组件名称 | 注释 | |
1 | Distance | 距离测量值数组 |
2 | 速度 | 速度测量值数组 |
3 | 距离时间 | 距离测量时间数组 |
4 | 速度时间 | 速度测量时间数组 |
5 | 距离 X | 对应距离测量的地面站 X 坐标数组 |
6 | 距离 Y | 对应距离测量的地面站 Y 坐标数组 |
7 | 距离 Z | 对应距离测量的地面站 Z 坐标数组 |
8 | 速度 X | 对应速度测量的地面站 X 坐标数组 |
9 | 速度 Y | 对应速度测量的地面站 Y 坐标数组 |
10 | 速度 Z | 对应速度测量的地面站 Z 坐标数组 |
11 | 距离 Sigma | 距离测量的标准差数组 |
12 | 速度 Sigma | 速度测量的标准差数组 |
让我们来解释一下这个表格。我们有两个测量数组。第一个数组 d1, d2, ... 包含距离的测量值。第二个数组 V1, V2 ... 包含速度的测量值。上表的前两行对应这两个数组。测量值 d1, d2, ... 是在不同时间进行的。上表的第三行对应这些测量的时间数组。类似地,第四行对应 V1, V2 ... 测量的时间数组。一组地面站被用于测量。假设 di 是由坐标为 Xi, Yi, Zi 的地面站获得的。表格的第5、6、7行对应 Xi, Yi, Zi 数组。类似地,第8-10行对应地面站的坐标和 Vi 测量值。请注意,不同的测量具有不相等的精度。通用线性方法要求对此类测量使用不同的权重。为此开发了一个新组件 。它使我们能够创建加权选择。在轨道确定的情况下,测量具有不同的方差。因此我们处于加权最小二乘的情况。所以需要测量的方差。第11行和第12行分别包含 di 和 Vi 的方差数组。组件 Distance Selection 和 Velocity Selection 是包含测量值及其方差的“加权选择”。Distance Selection 的属性如下所示:

此图具有以下含义:
- 测量值数组包含在 Distance 组件的纵坐标中。
- 方差数组包含在 Distance Sigma 组件的纵坐标中。
Velocity Selection 组件的构建方式类似。我使用了图表 组件来存储选择。这样做是为了让用户能够在没有数据库的情况下尝试这个例子。实际上,这个场景应该使用连接到数据库的图表
。
4.2.2.2 非线性回归
在统计学中,非线性回归是拟合一个模型的问题。
到多维 x,y 数据,其中 f 是 x 的一个非线性函数,回归参数为 θ。
非线性回归操作选择。该软件实现了两种操作选择的方法。第一种方法是迭代加载选择,即一步一步地加载。第二种方法是一次性加载选择。
使用迭代回归的非线性回归软件架构如下图所示:
让我们描述一下这个方案的组件。迭代器提供输入选择 x 和 y。y 是拟合方程的左侧部分。Transformation 对应于非线性函数 f,并生成拟合模型的左侧部分。Processor 协调所有操作并修正回归参数。
一次性加载选择的软件架构如下图所示:
处理器将计算参数与选择进行比较,计算残差,然后修正回归参数。在这两个方案中,迭代器、选择等不是具体的组件。它们是实现迭代器、选择等接口的组件。例如,一个相机组件可以实现选择接口。在这里,我将简要考虑示例。更深入的描述可以在该项目的文档中找到。第二种方案用于确定轨道。
4.2.2.3 要素
上图包含了非线性回归的一般要素。让我们考虑与轨道确定相关的要素。选择已经在 6.1 中考虑过。回归参数是卫星坐标和速度分量的初始值。这些参数包含在 Motion equations 组件中。这些参数如下图所示。

如前所述,参数 x, y, z, u, v, w 是坐标和速度分量。上图的上半部分包含了轨道确定前这些参数的值。下半部分包含了轨道确定后的值。这些参数在轨道确定过程中会发生变化。转换阶段包括以下步骤:
- 计算卫星轨迹
- 计算时间偏移
- 计算距离和速度
Accumulator 组件将轨迹参数作为实际函数进行计算。让我们解释一下什么是实际函数。函数的定义有两种观点。根据潜在观点,函数 f(t) 是在已知参数 t 的情况下对 f 的计算。实际观点意味着函数 f 是一个单一(实际)的对象。实际函数可以通过在不同的 t 值下计算 f(t) 的值来从潜在函数获得。Motion equations 组件执行运动参数的潜在计算,而 Accumulator 对象将这些潜在函数转换为实际函数。Accumulator 的属性如下所示。

根据这些属性,Accumulator 计算 f(t0), f(t1), f(t2), ... 其中 t0 = 1770457504 (Start), ti+1 - ti = 10 (Step)。参数值的数量等于 2500 (Step count)。因此,Accumulator 存储 f(t0), f(t1), f(t2) 以及对于任何 t0 < t < t2500 的值。然后通过三次多项式插值得到 f(t)。需要注意的是,距离和速度的测量不是瞬时的,因为光速是有限的。地面站在 t1 时刻发送信号,然后卫星在 t2 时刻发送反射信号,最后地面站在 t3 时刻接收信号。测量时间是 t3。然而,距离测量值并不是卫星和地面站在 t3 时刻的距离。它等于 (d1 - d2) / 2,其中 d1 是地面站在 t1 时刻和卫星在 t2 时刻之间的距离,类似地 d2 是地面站在 t3 时刻和卫星在 t2 时刻之间的距离。Difference 和 Time + Shift 组件使我们能够考虑到这种情况。Difference 组件的属性如下图所示。

该组件的输出被 Time + Shift 使用。Time + Shift 的属性如下所示:

该组件计算卫星反射信号的时间数组。组件 Delta 是一个辅助组件。它具有以下属性:

Measurements 组件计算距离和速度的测量值。该组件具有以下属性:

这些参数与选择进行比较。Processor 组件执行这种计算或(用另一个术语)回归。回归公式如下所示:

Processor 组件反映了此公式。该组件的属性如下所示:

上图窗口的左侧部分对应于回归公式中的 x。在所考虑的情况下,x 的分量是坐标和速度分量。下表包含了向量 x 的分量。
物理参数 | 标识符 | |
1 | X | 运动方程/运动方程.x |
2 | Y | 运动方程/运动方程.y |
3 | Z | 运动方程/运动方程.z |
4 | Vx | 运动方程/运动方程.u |
5 | Vy | 运动方程/运动方程.v |
6 | Vz | 运动方程/运动方程.w |
上述窗口的中间部分包含了回归公式的 f(x)。f(x) 向量包含两个子向量 Formula_1 和 Formula_2,它们属于 Measurements 组件。这些子向量是计算出的距离和速度值。上述窗口的右侧部分对应于回归公式的 y。向量 y 包含两个选择,分别对应距离和速度测量。点击 Iterate 按钮启动非线性回归的一步。
4.2.2.4 总结
轨道确定需要将运动参数作为实际函数。此外,还需要经过时间延迟移位的函数。然而,运动方程没有显式解。因此,使用了 Accumulator 组件。粗略地说,它将潜在的 f(x) 函数转换为实际的 f 函数。
4.2.3 轨道确定容器
上述任务已在我的文章中描述。这里描述的是一个扩展任务。轨道确定任务被聚合以便于进一步开发。聚合结果如下所示:
扩展任务如下图所示:
它还包含视频、音频和文档生成。
4.2.4 视频
视频任务更像是“f(t)”而不是“f”,其中 t 是时间变量。以下组件用于视频支持:
Camera 组件是一个虚拟的 WPF 透视相机。它具有以下属性:
Globe 是地球仪的3D模型。它包含XAML 3D模型和纹理。Globe 和 Camera 分别虚拟安装在 Base frame 和 Camera Frame 上。Base frame 和 Camera Frame 都是虚拟的3D笛卡尔坐标系。这些系统用于模拟 Camera 相对于 Globe 的运动。Base frame 是格林尼治参考系。其他参考系按以下方式构建:
这张图的含义如下。Frame 1、Frame 2、Camera Frame 的运动被视为相对于 Base frame、Frame 1、Frame 2 的相对运动。设 x, y, z 为卫星的坐标,则 Frame 1 相对于 Base frame 有一个非零的线性位移 (x, y, z)。同时,该坐标系绕 Z 轴旋转了经度角。Frame 2 相对于 Frame 1 没有位移。然而,它绕 Y 轴旋转了纬度角。Camera Frame 相对于 Frame 2 没有位移,且具有以下变换矩阵:
这些坐标系的视觉图像如下所示
其中 分别是卫星的纬度和经度。Frame 1 的坐标轴与 X'Y'Z' 的坐标轴平行,在上图中这两个坐标系都为红色。然而,Frame 1 的中心与卫星的质心重合。Frame 2 的坐标轴与 X''Y''Z'' 的坐标轴平行,在上图中这两个坐标系都为蓝色,且 Frame 2 的中心也与卫星的质心重合。组件 Angles 和 Quaternions 用于方向计算。Angles 的属性如下所示:
变量 x, y, z 就是卫星的坐标 x, y, z。Formula_1, Formula_2 分别是卫星的经度和纬度。Frame 1 和 Frame 1 的旋转可以分别用以下四元数表示:
Quaternions 组件计算上述四元数所需的数据。Quaternions 组件的属性如下所示:
以下图片和表格展示了 Frame 1 和 Frame 2 的属性
.
Frame 1 的属性
N | 参数名称 | 坐标系参数 | 导入参数 | 注释 |
1 | X | X - 坐标系的相对位移 | 轨道确定/运动方程/运动方程.x | 卫星的 X 坐标 |
2 | Y | Y - 坐标系的相对位移 | 轨道确定/运动方程/运动方程.y | 卫星的 Y 坐标 |
3 | Z | Z - 坐标系的相对位移 | 轨道确定/运动方程/运动方程.z | 卫星的 Z 坐标 |
4 | Q0 | 四元数的实部 | Quaternions.Formula_1 | cos(经度/2) |
5 | Q1 | i - 四元数分量 | Quaternions.Formula_5 | 0 |
6 | Q2 | j - 四元数分量 | Quaternions.Formula_5 | 0 |
7 | Q3 | k - 四元数分量 | Quaternions.Formula_2 | sin(经度/2) |
Frame 2 的属性
N | 参数名称 | 坐标系参数 | 导入参数 | 注释 |
1 | X | X - 坐标系的相对位移 | Quaternions.Formula_5 | 0 |
2 | Y | Y - 坐标系的相对位移 | Quaternions.Formula_5 | 0 |
3 | Z | Z - 坐标系的相对位移 | Quaternions.Formula_5 | 0 |
4 | Q0 | 四元数的实部 | Quaternions.Formula_1 | cos(纬度/2) |
5 | Q1 | i - 四元数分量 | Quaternions.Formula_5 | 0 |
6 | Q2 | j - 四元数分量 | Quaternions.Formula_5 | sin(纬度/2) |
7 | Q3 | k - 四元数分量 | Quaternions.Formula_2 | 0 |
Camera frame 用于将 Camera 的光轴定向到地球中心。
4.2.5 音频
让我们考虑以下音频支持,当卫星穿过赤道时会播放声音。
音频支持中包含以下声音:
- 如果卫星从南半球移动到北半球,播放“Up”这个词;
- 如果卫星从北半球移动到南半球,播放“Down”这个词。
这个任务也更像是“f(t)”而不是“f”,其中 t 是时间变量。下图展示了这个示例的组件。
Sound Recursive 是一个执行以下递归计算的元素:
yn=zn;
xn=yn-1;
其中 zn 是卫星在第 nth 计算步的 z 坐标。由于在北半球 z > 0,在南半球 z < 0,我们有以下赤道穿越条件:
N | 条件 | 含义 |
1 | (zn-1 < 0) 且 (zn > 0) | 卫星从南半球穿越赤道到北半球 |
2 | (zn-1 > 0) 且 (zn < 0) | 卫星从北半球穿越赤道到南半球 |
Sound formula 组件生成这些条件的公式。
Sound 组件用于根据下表播放声音
N | 条件参数 | 含义 | 声音文件 |
1 | Sound formula.Formula_1 = true | 卫星从南向北穿越赤道平面 | up.wav |
2 | Sound formula.Formula_2 = true | 卫星从北向南穿越赤道平面 | down.wav |
4.2.6 文档生成
在这个示例中,使用了实际函数 f。然而,这个函数有另一个参数。这个参数是卫星的 Z- 坐标。
除了计算,任何软件都需要生成文档。文档生成的功能在预测问题上得到了展示。预测文档包含卫星在穿越赤道时的运动参数。下图解释了预测问题。

卫星沿着其轨道运动。运动参数对应于它从南向北移动并穿越赤道的时间。当卫星的 Z 坐标等于 0 时,它穿越赤道。如果我们有坐标和时间作为 Z 的函数,那么我们可以看到所需的参数是这些函数在 Z = 0 时的值。下图展示了此任务的解决方案。

Delay 组件的类型是 FunctionAccumulator
。这种类型与 Simulink 的Transport delay 非常相似。然而,FunctionAccumulator
更为先进。Delay 的属性如下所示:

Delay 组件连接到 Data 组件。它存储 Data 的最新输出值。Step count = 4 意味着 Delay 存储每个输出参数的最后 4 个值。数据的 Formula_4 是卫星的 Z 坐标。因此,Delay 的所有参数都被视为 Z 的函数。让我们来看一下预测的所有组件。Satellite 组件是一个包含卫星 Motion equations 的容器。Data 组件连接到 Motion equations,并将时间参数添加到运动参数中。Data 的属性如下所示。

Recursive 组件类似于 Simulink 的Memory 组件。该组件计算 Z 坐标的时间延迟。Recursive 元素的属性如下所示:

Condition 元素用于确定赤道穿越的时间。Condition 的属性如下所示:

此组件的参数含义包含在注释中。

最后,Output 组件包含预测参数的计算。它有以下公式:

数字 86400 是一天中的秒数。time 函数将 double
变量转换为 DateTime
。b 是赤道穿越的条件。输入参数是作为 Z 函数的运动参数。完整的参数列表包含在以下注释中:

最后,Chart 组件具有以下属性:

这些属性具有以下含义。当条件变量为 true
时执行输出。在这种情况下,条件是 Condition
对象的 Formula_1。它是赤道穿越的条件。输出参数是 Output
对象的 Formula_1 - Formula_7。标签 X, Y, Z, Vx, Vy, Vz 是在 XML 文档中反映的标签。XML 文档如下所示:
<Root>
<Parameters>
<Parameter Name="T" Value="Monday, June 28, 1999 11:17:05 PM.457" />
<Parameter Name="X" Value="-6595.47050815637" />
<Parameter Name="Y" Value="-2472.05799683873" />
<Parameter Name="Z" Value="0" />
<Parameter Name="Vx" Value="-0.541295154046453" />
<Parameter Name="Vy" Value="1.46945520971716" />
<Parameter Name="Vz" Value="7.45051367374592" />
</Parameters>
<Parameters>
<Parameter Name="T" Value="Tuesday, June 29, 1999 12:55:08 AM.068" />
<Parameter Name="X" Value="-7026.76544757067" />
<Parameter Name="Y" Value="487.053173194772" />
<Parameter Name="Z" Value="0" />
<Parameter Name="Vx" Value="0.117122882887633" />
<Parameter Name="Vy" Value="1.56173832654579" />
<Parameter Name="Vz" Value="7.45055871464937" />
</Parameters>
<Root>
第一个参数是 DateTime
类型,其他参数是 double
类型。XML 文档反映了这种情况。XSLT(可扩展样式表语言转换)用于生成文档。以下代码包含 XSLT 文件。
<xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts">
<xsl:template match="/">
<html>
<body>
<p>
<h1>Forecast</h1>
</p>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="Parameters">
<p></p>
<p>
<table border="1">
<xsl:apply-templates />
</table>
</p>
</xsl:template>
<xsl:template match="Parameter">
<xsl:apply-templates />
<tr>
<td>
<xsl:value-of select="@Name" />
</td>
<td>
<xsl:value-of select="@Value" />
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
此 XSLT 代码提供了以下 HTML 文档。
T | 1999年6月28日星期一 晚上11:17:05.457 |
X | -6595.47050815637 |
Y | -2472.05799683873 |
Z | 0 |
Vx | -0.541295154046453 |
Vy | 1.46945520971716 |
Vz | 7.45051367374592 |
T | 1999年6月29日星期二 凌晨12:55:08.068 |
X | -7026.76544757067 |
Y | 487.053173194772 |
Z | 0 |
Vx | 0.117122882887633 |
Vy | 1.56173832654579 |
Vz | 7.45055871464937 |
4.2.7 简要说明
4.2.7.1 解压以下存档
4.2.7.2 安装音频文件
安装音频文件包括以下步骤。
步骤 1. 将 SOUNDS
目录复制到任何目录。
步骤 2. 通过以下方式设置解压文件的目录
4.2.7.3 安装容器
将 Containers
目录复制到 Aviation.exe
文件所在的目录;
4.2.7.4 开始动画
启动 Aviation.exe
。打开 Orbit.cfa
文件。点击下面的动画按钮
关注点
我的上司告诉我:“不要读那些高深的书。如果你继续读下去,你会有很多嫉妒你的人。”上司说得完全正确。我确实有很多嫉妒我的人。然而,我还是继续读那些高深的书。