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

求解莫比乌斯变换系数

在这里插入图片描述

文章目录

  • 一、说明
  • 二、如何确定双线性变换系数
    • 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.mfbz.cn/a/593092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJS:补间动画与Tween.JS

补间动画 补间动画指的是做FLASH动画时&#xff0c;在两个关键帧中间需要做“补间动画”&#xff0c;才能实现图画的运动&#xff1b;插入补间动画后两个关键帧之间的插补帧是由计算机自动运算而得到的。 ——摘自《百度百科&#xff1a;补间动画_百度百科》 Tween.js Tween.js…

Python-VBA函数之旅-oct函数

目录 一、oct函数的常见应用场景 二、oct函数使用注意事项 三、如何用好oct函数&#xff1f; 1、oct函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、oct函数的常见应用场景 oc…

W801学习笔记十七:古诗学习应用——上

硬件驱动以及软件架构大体上已经完成&#xff0c;尚存一些遗漏之处&#xff0c;后续会寻找合适的时机进行补充。自此章起&#xff0c;将正式迈入软件应用阶段&#xff0c;尤其是游戏开发领域。 关于第一个应用&#xff0c;此前已有一些构想&#xff1a; 其一&#xff0c;随机…

IO流-其他流:数据流,序列化流

import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream;public class DataOutputStream1 {public static void main(String[] args) {//创建一个数据输出流包装一个低级的字节输出流try (DataOutputStream dosnew DataOutp…

9.3.k8s的控制器资源(deployment部署控制器)

目录 一、deployment部署控制器概念 二、deployment资源的清单编写 三、小结 功能 使用场景 原理 四、deployment实现升级和回滚 1.编辑deployment资源清单&#xff08;v1版本&#xff09; 2.创建service资源用于访问 ​编辑 3.修改deploy清单中pod镜像版本为V2 4…

「C/C++ 01」scanf()与回车滞留问题

目录 〇、scanf()接收用户输入的流程 一、回车的缓冲区滞留问题是什么&#xff1f; 二、为什么&#xff1f; 三、四个解决方法&#xff1a; 1. 在前面的scanf()中加上\n 2. 在scanf("%c")中添加空格 3. 使用getchar()来吸收回车 4. 使用fflush()清空缓冲区 〇、scan…

2.spring security 简单入门

创建springboot 项目&#xff0c;引入spring security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring security坐标--><dependency&g…

leecode每日一练

我一开始的思路也是dp&#xff0c;但是转移方程想错了&#xff0c;这个题目转移方程应该是dp[i] max(dp[i-2]nums[i],dp[i-1]) class Solution { public:int rob(vector<int>& nums) {int len nums.size();vector<int> dp(len);int ans 0;if(len>1)dp[0]…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道&#xff0c;博主在物联网领域深耕多年。 时序数据库&#xff0c;博主已经用过很多&#xff0c;从最早的InfluxDB&a…

《Fundamentals of Power Electronics》——脉宽调制器建模

下图给出了一个简单脉宽调制器电路的原理图。 脉宽调制器电路产生一个用于指令转换器功率管导通和关断的逻辑信号δ(t)。该逻辑信号δ(t)是周期性的&#xff0c;其频率为fs&#xff0c;占空比为d(t)。脉宽调制器的输入是一个模拟控制信号vc(t)。脉宽调制器的作用是产生一个与模…

观测与预测差值自动变化系统噪声Q的自适应UKF(AUKF_Q)MATLAB编写

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应扩大系统方差Q&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统的UKF相比&…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5&#xff1a;自然语言处理实践&#xff08;情感分类&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;掌握RNN、LSTM、GRU的原理。 2&#xff1a;学习用RNN、LSTM、GRU网络建立训练模型&#xff0c;并对模型进行评估。 3&#xff1a;学习用RNN、LSTM、GRU网络做…

递归、搜索与回溯算法:记忆化搜索

例题一 解法&#xff08;暴搜 -> 记忆化搜索 -> 动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 暴搜&#xff1a; a. 递归含义&#xff1a;给 dfs ⼀个使命&#xff0c;给他⼀个数 n &#xff0c;返回第 n 个斐波那契数的值&#xff1b; b. 函数体&…

JVM知识总汇(JVM面试题篇5.1)

个人理解&#xff0c;所学有限&#xff0c;若有不当&#xff0c;还请指出 1.JVM是由哪些部分组成&#xff0c;运行流程是什么&#xff1f; JVM为java虚拟机&#xff0c;是java程序的运行环境&#xff08;其实是java字节码文件的运行环境&#xff09;&#xff0c;能够实现一次编…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

分层解耦-三层架构

一、使用三层架构的原因 如果所有代码都写在controller类的方法中&#xff0c;这里面包含了数据访问的代码、逻辑处理的代码、接收请求和响应数据的代码&#xff0c;如图示例: 而我们在进行软件设计以及软件开发的时候&#xff0c;要尽量让每一个接口、类或者方法的职责更加单…

深入理解分布式事务⑧ ---->MySQL 事务的实现原理 之 MySQL 事务流程(MySQL 事务执行流程 和 恢复流程)详解

目录 MySQL 事务的实现原理 之 MySQL 事务流程&#xff08;MySQL 事务执行流程 和 恢复流程&#xff09;详解MySQL 事务流程1、MySQL 事务执行流程1-1&#xff1a;MySQL 事务执行流程如图&#xff1a; 2、MySQL 事务恢复流程2-1&#xff1a;事务恢复流程如下图&#xff1a; MyS…

西门子V90参数移植方法

西门子V90参数移植方法 应用方面 由于设备老化损坏&#xff0c;需要更换V90驱动器&#xff0c;但是由于新驱动器与旧驱动器出现版本不一样时参数就会无法直接下载到新的驱动器里面&#xff0c;为了保证更换驱动器的稳定性最好能使用之前设备的参数&#xff0c;所以写了关于V9…

车载电子电器架构 —— 如何理解和使用Update bit

车载电子电器架构 —— 如何理解和使用Update bit 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不…

2024抖音直播带货-直播间拆解:抖店运营从入门到精通(56节课)

起号原理方式以及节点处理 类目的选择选品思路 付费流量投放原理 直播间进阶玩法 课程内容 直播间搭建标准自然起号(0-1)原理 方式 以及节点处理 老号重启(0-1)原理 方式 以及节点处理 账号在线人数稳定 原理 方式 以及节点处理 账号销售额放大 原理 方式 以及节点处理…
最新文章