渐近线中的分数线性变换

渐近线中的分数线性变换

我正在使用 Asymptote 创建一些图形来展示双曲平面圆盘模型中的结构,并且我需要能够通过分数线性变换 (FLT) 来转换路径,但还没有找到任何可以满足我需要的内置功能。

我需要做两件事:

  1. 给定单位圆上的两对点 (a,b) 和 (c,d),找到将 a 映射到 b、将 c 映射到 d 并保留单位圆的 FLT。
  2. 给定一个 FLT 和一条路径(特别是表示测地线的圆弧),找到在 FLT 下原始路径的图像的路径。

如果有一个现成的包可以完成部分或全部这些功能,那就再理想不过了。如果没有,下面就是我自己编写实现所有这些功能的绊脚石。

  • FLT 由 4 元组确定,彼此的标量倍数确定相同的 FLT;具体来说,上面的项目 (1) 可以简化为查找秩为 3 的 4x4 矩阵的核。Asymptote 包含一个例程(“求解”),用于在 A 非奇异时查找 Ax=b 的解,但我不知道如何在 A 为奇异时使用它来求解 Ax=0。 (这是我面临的主要困难。)
  • 一旦知道了确定 FLT 的系数,变换点就只是复杂的乘法、除法和加法的问题了,所以我可以编写一个函数 F,该函数以 FLT 的系数和初始点作为输入,并以这些点的图像作为输出。我在项目 (2) 中真正想要的是一个类似的函数 G,它不是作用于点而是作用于路径。一旦点版本可用,我可能就能想出一种方法让该函数作用于路径,但这需要我在文档中挖掘一些内容,因此,如果有一种自然的(预定义的?)方法来定义一个函数 G,该函数通过根据 F(和 DF)变换所有控制点和切向量来作用于路径,那么当然最好使用这种方法。

答案1

这是一个临时函数,它返回一个单位向量,给定一个奇异矩阵A,它返回一个非常接近于 核的单位向量A。如果A是非奇异的,则返回的单位向量是无意义的。基本思想是反转A+e,其中e是少量的随机噪声。如果A是奇异的,那么它的核将(非常接近)具有天文数字大的特征值的特征空间(A+e)^{-1}。因此,对于随机向量v(A+e)^{-1}(v)将非常巨大并且非常接近于 的核A

两个注意事项。首先,我只在一种情况下测试了此代码。其次,除了上面描述的固有随机性之外,它还依赖于内置矩阵求解器的数值稳定性。

import stats;

real length(real[] v) {
  real ans = 0;
  for (real a : v) ans += a*a;
  return sqrt(ans);
}

real[] kernel_vector(real[][] matrix4x4) {
  real[][] A = copy(matrix4x4);
  for (int i = 0; i < A.length; ++i) {
    for (int j = 0; j < A[i].length; ++j) {
      A[i][j] += 1e-5 * Gaussrand();
    }
  }
  real[] v = new real[A[0].length];
  for (int i = 0; i < v.length; ++i)
    v[i] = Gaussrand();
  real[] ans = solve(A, v);
  return ans / length(ans);
}

对于第二点,将非线性变换应用于路径而不仅仅是点:参见https://tex.stackexchange.com/a/161146/484

相关内容