【莫比乌斯变换-04】求解莫比乌斯变换系数

news2024/11/16 11:34:47

求解莫比乌斯变换系数

在这里插入图片描述

文章目录

  • 一、说明
  • 二、如何确定双线性变换系数
    • 2.1 变换基本形式
    • 2.2 通过三点确定
  • 三、一般情况的变换
    • 3.1 最简单的情况:无穷大
    • 3.2 处理无穷大
  • 四、Python 代码

一、说明

上一篇文章是对双线性变换的视觉介绍,又名莫比乌斯变换或分数线性变换。这篇文章是一个简短的后续文章,更多地关注如何计算变换的系数。

二、如何确定双线性变换系数

2.1 变换基本形式

双线性变换(莫比乌斯变换) f 的形式为:

f ( z ) = a z + b c z + d f(z) = \frac{az + b}{cz + d} fz=cz+daz+b

其中 A D – B C ≠ 0 AD – BC ≠ 0 ADBC=0

逆变换,f 的倒数由下式给出

g ( w ) = d w − b − c w + a g(w) = \frac{dw - b}{-cw + a} gw=cw+adwb

变换 f 在除 z = –d/c 之外的任何地方都定义,其逆变换在除 w = a/c 之外的任何地方都定义。

所以 f 将复平面减去 1 点到复平面减去 1 点。或者一种优雅的思考方式是通过在无穷远处添加一个点来将 f 和 g 视为球体上的函数。然后我们说

f ( − d / c ) = ∞ g ( ∞ ) = − d / c f ( ∞ ) = a / c g ( a / c ) = ∞ \begin{align*} f(-d/c) &= \infty \\ g(\infty) &= -d/c \\ f(\infty) = a/c \\ g(a/c) &= \infty \end{align*} fd/cgf=a/cga/c==d/c=

2.2 通过三点确定

双线性变换有三个自由度。也就是说,您可以在域中选取三个值,并为它们在范围内指定三个位置。唯一的双线性变换发送 z1、z2和 z3至 W1、w2和 w3由下式给出

( w − w 2 )( w 3 − w 1 ) ( w − w 1 )( w 3 − w 2 ) = ( z − z 2 )( z 3 − z 1 ) ( z − z 1 )( z 3 − z 2 ) \frac{(w - w_2)(w_3 - w_1)}{(w - w_1)(w_3 - w_2)} = \frac{(z - z_2)(z_3 - z_1)}{(z - z_1)(z_3 - z_2)} ww1)(w3w2ww2)(w3w1=zz1)(z3z2zz2)(z3z1

代入常量并求解 w = f(z)。

更新:以下是系数的显式公式。
例如,让我们看一下上一篇文章中的笑脸示例。

在这里插入图片描述

我们会在脸上选择三个点和三个地方让他们去。
假设我们希望脸部的中心保持原位,将 0 映射到 0。接下来,让我们选择两个眼睛中心的位置。这些在±0.4+.2ji。假设我们希望左眼下降一点到 -0.4,右眼上升一点到 0.5 + 0.3i。

我使用 Mathematica 求解参数。

{z1, z2, z3} = {0, -2/5 + I/5, 2/5 + I/5}
{w1, w2, w3} = {0, -2/5, 1/2 + 3 I/10}
Solve[(w - w2) (w3 - w1)/((w - w1) (w3 - w2)) == 
      (z - z2) (z3 - z1)/((z - z1) (z3 - z2)), w]

这表示参数在 Python 表示法中是,

a = -72 - 16j
b = 0
c = 30 - 35j
d = -75

使用上一篇文章中的代码,我们可以验证此转换是否执行了我们设计它的功能。

print(mobius(0, a, b, c, d))
print(mobius(-0.4 + 0.2j, a, b, c, d))
print(mobius(0.4 + 0.2j, a, b, c, d))

我们可以看看结果。
在这里插入图片描述

三、一般情况的变换

上文说明,莫比乌斯变换由其在三个点上的值唯一决定。通过这个信息确定莫比乌斯变换的系数。我说上面计算不失为一个方法,但仍有一些工作要做。在特定情况下,找到系数并不难,但一般来说要找到系数会更难。

给定指定的点 z 的每个参数 a、b、c 和 d 都有一个显式公式1、z2、z3和他们的图像 w1、w2、w3我们稍后将介绍。我们可以很容易地对这些公式进行编码,但有一个复杂因素除外:我们可能希望我们的一个输入,我们的输出是∞的。这不仅仅是一个极端情况:在应用中,例如信号处理,您通常希望指定极点的位置。

3.1 最简单的情况:无穷大

如果输入或输出都不是无限的,则系数由下式给出

a = ∣ z 1 w 1 w 1 1 z 2 w 2 w 2 1 z 3 w 3 w 3 1 ∣ b = ∣ z 1 w 1 z 1 w 1 z 2 w 2 z 2 w 2 z 3 w 3 z 3 w 3 ∣ c = ∣ z 1 w 1 w 1 1 z 2 w 1 w 2 1 z 3 w 1 w 3 1 ∣ d = ∣ z 1 w 1 z 1 1 z 2 w 2 z 2 1 z 3 w 3 z 3 1 ∣ \begin{align*} a &= \begin{vmatrix} z_1w_1 & w_1 & 1 \\ z_2w_2 & w_2 & 1 \\ z_3w_3 & w_3 & 1 \end{vmatrix} \\ b &= \begin{vmatrix} z_1w_1 & z_1 & w_1 \\ z_2w_2 & z_2 & w_2 \\ z_3w_3 & z_3 & w_3 \end{vmatrix} \\ c &= \begin{vmatrix} z_1\phantom{w_1} &w_1 & 1 \\ z_2\phantom{w_1} & w_2 & 1 \\ z_3\phantom{w_1} & w_3 & 1 \end{vmatrix} \\ d &= \begin{vmatrix} z_1w_1 & z_1 & 1 \\ z_2w_2 & z_2 & 1 \\ z_3w_3 & z_3 & 1 \end{vmatrix} \end{align*} abcd= z1w1z2w2z3w3w1w2w3111 = z1w1z2w2z3w3z1z2z3w1w2w3 = z1w1z2w1z3w1w1w2w3111 = z1w1z2w2z3w3z1z2z3111

这是一种解决方案;将所有四个系数乘以一个非零常数可以得到另一个解决方案。但是模常数,解是唯一的。换句话说,莫比乌斯变换是唯一的,但它的表示只有在分子和分母相乘的常数之前是唯一的。

你可能会希望这个公式会起作用,如果你只是让浮点无穷大自己照顾好自己。但是,如果 z 或 w 中的任何一个是无限的,那么上面的每个行列式都是无限的。

3.2 处理无穷大

无穷大的可能情况是:

  • 无穷大

  • 只有一个 z 是无限的

  • 只有一个 w 是无限的

  • 具有相同下标的 z 和 w 是无限的

  • 具有不同下标的 z 和 w 是无限的
    我们的 z 和 w 的顺序是任意的,因此为了方便起见,我们可以在必要时重新排列它们。因此,在不失去普遍性的情况下,我们可以假设

  • 无穷大

  • 只有 z1是无限的

  • 只有 w1是无限的

  • z1 = w1= ∞

  • z1 = w2= ∞
    处理 z 的情况 (2)1= ∞,将上面的每个方程除以 z1并将极限设为 z1接近∞。由于矩阵的一行除以一个常数将其行列式除以相同的量,因此在每种情况下,我们将第一行除以 z1.这效果很好,因为 z1只出现在每个矩阵的第一行中。我们可以处理 2 个案例 (3)1= ∞ 类似。

处理 z 的情况 (4)1 = w1= ∞我们将第一行除以 z1 w1并采取限制。处理 z 的情况 (5)1 = w2= ∞我们将第一行除以 z1第二行由 W1并采取限制。

如果你觉得这个限制性业务是可疑的,那也没关系:如果结果是正确的,它就是正确的。由于莫比乌斯变换是由它们在三个点上的值决定的,因此您可以通过坚持 z 来验证每种情况是否正确1、z2、z3并检查你是否得到 W1、w2、w3外。您可以手动执行此操作,我有,或者信任帖子底部的代码输出。

因此,这是我们的解决方案。

  • (1) 无无限
    如上所述。

  • (2) 只有 z1= ∞
    一个 = W1 (w2– W3)
    b = w1 (z2 w3– z3 w2) + w2 w3 (z3– z2)
    c = w2– W3
    d = w1 (z2– z3)– z2w2 + z3 w3

  • (3) 只有 w1= ∞
    a = z1 (w2– W3)– z2w2+ Z3 w3
    b = z1 (z2 w3– z3 w2) + z2 z3 (w2– W3)
    c = z3– z2
    d = z1 (z2– z3)

注意:你可以从案例 z 中推导出这些1= ∞ 通过反转转换。这意味着将 z 与 w 交换,将 a 和 d 交换,并否定 b 和 c。

  • (4) z1 = w1= ∞
    一个 = W2– W3
    b = z2 w3– z3 w2
    c = 0
    d = z2– z3

  • (5) Z1 = w2= ∞
    一个 = W1
    b = –z2 w3 + z3 (w3– W1)
    c = 1
    d = –z2

四、Python 代码

import numpy as np

def all_finite(z1, z2, z3, w1, w2, w3):
    a = np.linalg.det(
            [[z1*w1, w1, 1],
             [z2*w2, w2, 1],
             [z3*w3, w3, 1]])
    b = np.linalg.det(
            [[z1*w1, z1, w1],
             [z2*w2, z2, w2],
             [z3*w3, z3, w3]])
    c = np.linalg.det(
            [[z1, w1, 1],
             [z2, w2, 1],
             [z3, w3, 1]])
    d = np.linalg.det(
            [[z1*w1, z1, 1],
             [z2*w2, z2, 1],
             [z3*w3, z3, 1]])
    return (a, b, c, d)

def z1_infinite(z1, z2, z3, w1, w2, w3):
    assert(np.isinf(z1))
    a = w1*(w2 - w3)
    b = w1*(z2*w3 - z3*w2) + w2*w3*(z3 - z2)
    c = w2 - w3
    d = w1*(z2 - z3) - z2*w2 + z3*w3
    return (a, b, c, d)    

def w1_infinite(z1, z2, z3, w1, w2, w3):
    assert(np.isinf(w1))
    a = z1*(w2 - w3) - z2*w2 + z3*w3
    b = z1*(z2*w3 - z3*w2) + z2*z3*(w2 - w3)
    c = z3 - z2
    d = z1*(z2 - z3)
    return (a, b, c, d)        

def z1w1_infinite(z1, z2, z3, w1, w2, w3):
    assert(np.isinf(z1) and np.isinf(w1))
    a = w2 - w3
    b = z2*w3 - z3*w2
    c = 0
    d = z2 - z3
    return (a, b, c, d)            

def z1w2_infinite(z1, z2, z3, w1, w2, w3):
    assert(np.isinf(z1) and np.isinf(w2))
    a = w1
    b = -z2*w3 + z3*(w3 - w1)
    c = 1
    d = -z2
    return (a, b, c, d)                

def mobius_coeff(z1, z2, z3, w1, w2, w3):

    infz = np.isinf(z1) or np.isinf(z2) or np.isinf(z3)
    infw = np.isinf(w1) or np.isinf(w2) or np.isinf(w3)    

    if infz:
        if np.isinf(z2):
            z1, z2 = z2, z1
            w1, w2 = w2, w1
        if np.isinf(z3):
            z1, z3 = z3, z1
            w1, w3 = w3, w1
        if infw:
            if np.isinf(w1):
                return z1w1_infinite(z1, z2, z3, w1, w2, w3)
            if np.isinf(w3):
                z2, z3 = z3, z2
                w2, w3 = w3, w2
            return z1w2_infinite(z1, z2, z3, w1, w2, w3)
        else:
            return z1_infinite(z1, z2, z3, w1, w2, w3)
        
    if infw: # and all z finite
        if np.isinf(w2):
            z1, z2 = z2, z1
            w1, w2 = w2, w1
        if np.isinf(w3):
            z1, z3 = z3, z1
            w1, w3 = w3, w1
        return w1_infinite(z1, z2, z3, w1, w2, w3)

    return all_finite(z1, z2, z3, w1, w2, w3)

def mobius(x, a, b, c, d):
    if np.isinf(x):
        if c == 0:
            return np.inf
        return a/c
    if c*x + d == 0:
        return np.inf
    else:
        return (a*x + b)/(c*x + d)
    
def test_mobius(z1, z2, z3, w1, w2, w3):
    tolerance = 1e-6
    a, b, c, d = mobius_coeff(z1, z2, z3, w1, w2, w3)
    for (x, y) in [(z1, w1), (z2, w2), (z3, w3)]:
        m = mobius(x, a, b, c, d)
        assert(np.isinf(m) and np.isinf(y) or abs(m - y) <= tolerance)

test_mobius(1, 2, 3, 6, 4, 2)
test_mobius(1, 2j, 3+7j, 6j, -4, 2) 
test_mobius(np.inf, 2, 3, 8j, -2, 0)
test_mobius(0, np.inf, 2, 3, 8j, -2)
test_mobius(0, -1, np.inf, 2, 8j, -2)
test_mobius(1, 2, 3, np.inf, 44j, 0)
test_mobius(1, 2, 3, 1, np.inf, 40j)
test_mobius(-1, 0, 3j, 1, -1j, np.inf)
test_mobius(np.inf, -1j, 5, np.inf, 2, 8)
test_mobius(1, np.inf, -1j, 5, np.inf, 2)
test_mobius(12, 0, np.inf, -1j, 5, np.inf)
test_mobius(np.inf, -1j, 5, 0, np.inf, -1)
test_mobius(6, np.inf, -1j, 0, 8, np.inf)
test_mobius(6, 3j, np.inf, -1j, np.inf, 1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷代码随想录有感(56):二叉搜索树的最小绝对差

题干&#xff1a; 代码:中序遍历成有序数组逐一比较相邻两个数之间的差值&#xff0c;注意这里是取最小值所以定义的初始值应该是非常大的INT_MAX&#xff01;&#xff01;&#xff01; class Solution { public:void traversal(TreeNode* root, vector<int>&a){if(…

tomcat+maven+java+mysql图书管理系统2-完善项目结构,添加相关依赖

1.创建java目录 接着选择java&#xff0c;回车&#xff0c;则创建成功&#xff0c;成功后在左侧栏能看见 2.修改pom.xml文件,(添加依赖) <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

iTOP-4412-裸机开发(环境搭建)

实验平台 ①SOC型号&#xff1a;samung Exynos 4412 ②使用软件&#xff1a;DNW v0.6C - For WinCE ③硬件平台&#xff1a;iTOP-4412 ④window版本&#xff1a;window10-64位 备注&#xff1a;此文章只有环境搭建部分。 版权声明 ①作者&#xff1a;coLin ②声明&#…

仿知乎网站问答源码,开源版

仿知乎网站问答源码&#xff0c;开源版 需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRedis&#xff1b; 开发环境&#xff1a;tomcat8.0&#xff0c;jdk8.0, ID…

图神经网络GNN的表达能力

回顾 图卷积神经网络GCN GNN概要 神经网络的表达能力 分类or回归 神经网络的表达能力举例&#xff1a; 深度学习的理论基础和上限 GNN的表达能力 定义&#xff1a;图神经网络的表达能力就是它区分不同图的区分能力 分析常见的GNN的表达能力并设计出表达能力最强的GN…

使用FPGA实现串-并型乘法器

介绍 其实我们知道&#xff0c;用FPGA实现乘法器并不是一件很简单的事&#xff0c;而且在FPGA中也有乘法器的IP核可以直接调用&#xff0c;我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看&#xff0c;串-并乘法器就是其中一个乘数…

电磁波的极化形式

极化是电磁波的一个固有属性,是指电磁波的电场矢量末端的轨迹曲线,电磁波的极化 状态由这条曲线所决定,电场的振动方向称为极化方向,极化方向与传播方向共同构成了极 化面。在通信链路中,只有接收机天线与被接收信号的极化形式匹配时,才能有效的接收信号,如果接收机天线…

STM32 串口IDLE接收空闲中断+DMA

参考 http://t.csdnimg.cn/fAV38 1.基础知识 STM32 IDLE 接收空闲中断 功能&#xff1a; 在使用串口接受字符串时&#xff0c;可以使用空闲中断&#xff08;IDLEIE置1&#xff0c;即可使能空闲中断&#xff09;&#xff0c;这样在接收完一个字符串&#xff0c;进入空闲状态时&…

OpenCV(五) —— 人脸识别模型训练与 Windows 下的人脸识别

本文主要内容&#xff1a; 如何训练 OpenCV 的人脸识别模型如何在 Windows 下利用 OpenCV 进行人脸识别 1、概述 人脸识别需要人脸模型&#xff08;特征集合&#xff09;的支持&#xff0c;人脸定位的速度与准确度取决于模型。 OpenCV 提供了已经训练好的模型&#xff0c;无…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中&#xff0c;无数的轨道、设备和设施交织在一起&#xff0c;如同一个精密的机器在高效运转。而在这背后&#xff0c;轨道交通巡检机器人正悄然登场&#xff0c;它们如同一个个智能的守护者&#xff0c;穿梭于各个场景之中。那么&#xff0c;这些…

2. 深度学习笔记--损失函数

在机器学习中&#xff0c;损失函数是代价函数的一部分&#xff0c;而代价函数则是目标函数的一种类型。 Loss function&#xff0c;即损失函数&#xff1a;用于定义单个训练样本与真实值之间的误差&#xff1b; Cost function&#xff0c;即代价函数&#xff1a;用于定义单个批…

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

富文本编辑器CKEditor4简单使用-08&#xff08;段落首行缩进插件 处理粘贴 Microsoft Word 中的内容后保持原始内容格式&#xff08;包括首行缩进&#xff09;&#xff09; 1. 缩进&#xff0c;特殊方式处理——修改原工具栏里的增加缩进量2 缩进&#xff0c;插件处理2.1 下载…

【Java基础】Maven的生命周期(clean+site+default)

1. 前言 在 Maven 出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署&#xff0c;但由于没有统一的规范&#xff0c;不同公司甚至不同项目之间的构建的方式都不尽相同。 Maven 从大量项目…

ES集群数据备份与迁移

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引&#xff0c;生成快照…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

2024新蓝海项目 零门槛高收益持续稳定 纯手机操控 单日盈利3000 新手当日入门

这个项目具有极高的稳定性&#xff01;通过积累的里程积分&#xff0c;我们可以以较低的成本获取机票。然后&#xff0c;我们以远低于官方网站的价格出售这些机票&#xff0c;从而获得利润。随着我们经营的时间增长&#xff0c;我们积累的客户群体也会越来越大。 项目 地 址 …

游戏AI的智能化:机器学习在虚拟生命中的应用

文章目录 写在前面游戏AI的智能化&#xff1a;机器学习在虚拟生命中的应用游戏内容的自动化创作&#xff1a;机器学习的革新性应用玩家体验的个性化优化&#xff1a;机器学习的定制化力量未来展望&#xff1a;机器学习塑造游戏行业新纪元游戏AI的智能化发展自动化内容生成的革命…

什么是脏读?幻读?不可重复读?

脏读(Drity Read)&#xff1a;某个事务 A 已更新一份数据&#xff0c;另一个事务 B 在此时读取了同一份数据&#xff0c;由于某些原因&#xff0c;事务 A 回滚&#xff0c;而事务B读取到事务 A 回滚前的数据。 例子:小明读取到小红提交的100数据.但是小红异常回滚了数据,100变…

【前端学习——正则】

https://www.bilibili.com/video/BV1da4y1p7iZ/?spm_id_from333.337.search-card.all.click&vd_source5cef5968d539682b683e7d01b00ad01b 学习网站 https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md