0

我的 DotNET 应用程序内置了有限的脚本语言(在 VBScript 上松散地建模),主要用于后处理数字、点和向量。我刚刚添加了对复数的支持,但我正在努力使用这种表示法。

我不想使用 A + Bi 表示法,因为如果 A 或 B 已经定义为方程,则它不是一个明确的划分:

31 * 5 + 6 + -5i

这可以解释为:

A = 31 * 5 + 6 B = -5i

和:

A = 31 * 5 B = 6 + -5i

我所知道的所有编程语言都没有对复数的原生支持。我在想类似下面的东西可能会起作用,但我会很感激对此的任何意见:

{31 * 5} + {6 + -5}i

复数(31 * 5, 6 + -5)

r{31 * 5} i{6 + -5}

4

4 回答 4

2

如果您希望简单地将复数的实部与虚部区分开来,我会执行以下操作之一。

  • 用某种形式的括号将数字括起来,以确保将其视为一个单位。例如,6+5i 变为 {6,5} 或 {6,5i} 以获得额外的可读性。
  • 引入一个标记来分隔各个部分,类似于 6.022e23 中的指数。例如,6+5i 变为 6i5。您仍然需要括号来指定这个公式,例如 6 + (b/2)i 变为 6i(b/2),而不是令人困惑的 6ib/2(也可以读作 (6ib)/2)不幸的是,您失去了将 i 作为变量的用途。

即使使用简单的解析器,它们中的任何一个都将很容易处理,并且它们与数学符号足够接近,以免混淆。我更喜欢第一个,因为它对我来说似乎更明确,并且使用不太可能混淆的符号。

于 2009-09-20T23:40:31.800 回答
1

您的用户是否有他们使用的特定符号?你能选择一个尽可能接近他们的吗?就我而言,我会使用 a + bi 所以我会说 {31 * 5} + {6 + -5}i 但是,如果他们习惯了函数形式,那么我建议 complex(31 * 5, 6 + -5 )。

由于您使用的是 .net,您可能想要使用 DLR 来提供您的脚本pythonruby​​ 语法?

于 2009-09-20T23:26:30.190 回答
1

我能找到的大多数具有复数内置类型的语言(例如 Python 和 Lisp)都使用如下内容:

c{r, i}
于 2009-09-21T12:52:27.867 回答
0

看来您在示例中使用了显式乘法(即您需要 A * B,而不是 AB )。

在这种情况下,为什么不直接在值后面使用 i 后缀,如

 myComplex = 12 + 6i
   or
 myOtherComplex = 12/7 + (6 * pi)i

然后你可能需要决定 i 或 j,我都见过......

这个 i 后缀技巧与科学通报没有什么不同,是 e(例如 3.1415e7)

编辑(按照大卫的评论)

上面的格式可能会变得令人困惑,具体取决于观众,澄清这一点的一种方法可能是只允许虚构的文字,并将它们包含在从现有矢量符号派生的复杂符号中。当虚数或复数需要一个表达式来指定它们时,语法将需要明确的“函数式”语法,例如 Imaginary(i) 和 Complex(r, i)。

解析规则

  • 任何数字(有符号或无符号、整数或小数,甚至是表示符号数)直接跟在后缀 i 之后都是虚数:-7i 或 1.23i 或 5.76e4i 但不是 12 i(数字和后缀之间不允许有空格)
  • 具有第一个实数和第二个虚数的二值向量是复数:(1, 7i) 或偶数 (7, 0i)
  • 当“i”值是表达式时,使用 Imaginary(i) 格式。i 表示没有方法调用语法所隐含的 i 后缀。
  • 当“r”或“i”参数是/是表达式时,以及当我们希望避免歧义时,使用 Complex(r,i) 格式。

简而言之

  • (7, 1i) , (0, -3.1415i), (13, 0i), Complex(13, 0) 或 Complex(7x+3, sin(y)+2) 都是复数
  • 6i, -1.234e5i, Imaginary(1.234) 或 Imaginary(sqrt(19x+5y)) 都是虚数
  • (12, 23, 34) 是 R^3 中的向量
  • (12i, -2i) 在 I^2 中的向量中(不是复数,因为第一个元素不是实数)
  • ((0,0i), (1,-9.2i), (12, 0i)) 或 ((0, 21i), Complex(12,3), (44, -55i)) 是 C^3 中的向量

这似乎是一致且足够简单的,但话又说回来,只有真正的最终用户才能知道。

于 2009-09-20T23:25:44.543 回答