Julia入門教程-複數和有理數

2021-02-20 數據遇到Python與Julia

Julia 語言包含了預定義的複數和有理數類型,並且支持它們的各種標準數學運算和初等函數。由於也定義了複數與分數的類型轉換與類型提升,因此對預定義數值類型(無論是原始的還是複合的)的任意組合進行的操作都會表現得如預期的一樣。

複數

在Julia 中, 全局常量「im」 被綁定到複數i,表示-1 的主平方根(不應使用數學家習慣的i 或工程師習慣的j 來表示此全局常量,因為它們是非常常用的索引變量名)。由於Julia 允許數值字面量作為係數與標識符並置,這種綁定就足夠為複數提供很方便的語法,類似於傳統的數學法:

julia> 1+2im
1 + 2im

你可以對複數進行各種標準算術操作,示例:

julia> (1 + 2im)*(2 - 3im)
8 + 1im

julia> (1 + 2im)/(1 - 2im)
-0.6 + 0.8im

julia> (1 + 2im) + (1 - 2im)
2 + 0im

julia> (-3 + 2im) - (5 - 1im)
-8 + 3im

julia> (-1 + 2im)^2
-3 - 4im

julia> (-1 + 2im)^2.5
2.729624464784009 - 6.9606644595719im

julia> (-1 + 2im)^(1 + 1im)
-0.27910381075826657 + 0.08708053414102428im

julia> 3(2 - 5im)
6 - 15im

julia> 3(2 - 5im)^2
-63 - 60im

julia> 3(2 - 5im)^-1.0
0.20689655172413796 + 0.5172413793103449im

提升機制確保了不同類型的操作數的組合能夠正常工作:

julia> 2(1 - 1im)
2 - 2im

julia> (2 + 3im) - 1
1 + 3im

julia> (1 + 2im) + 0.5
1.5 + 2.0im

julia> (2 + 3im) - 0.5im
2.0 + 2.5im

julia> 0.75(1 + 2im)
0.75 + 1.5im

julia> (2 + 3im) / 2
1.0 + 1.5im

julia> (1 - 3im) / (2 + 2im)
-0.5 - 1.0im

julia> 2im^2
-2 + 0im

julia> 1 + 3/4im
1.0 - 0.75im

注意:3/4im == 3/(4*im) == -(3/4*im),因為係數比除法的優先級更高。

Julia 提供了一些操作複數的標準函數:

julia> z = 1 + 2im
1 + 2im

# z的實部
julia> real(1 + 2im)
1

# z的虛部
julia> imag(1 + 2im)
2

#z的共軛複數
julia> conj(1 + 2im) # complex conjugate of z
1 - 2im

#z的絕對值
julia> abs(1 + 2im) # absolute value of z
2.23606797749979

#平方後的絕對值
julia> abs2(1 + 2im) # squared absolute value
5

#相位角(以弧度為單位)
julia> angle(1 + 2im) # phase angle in radians
1.1071487177940904

通常,複數的絕對值(abs)是從零點到它的距離。abs2 給出絕對值的平方,作用於複數上時非常有用,因為它避免了取平方根。angle 返回以弧度為單位的相位角(也被稱為輻角函數)。所有其

它的初等函數在複數上也都有完整的定義:

julia> sqrt(1im)
0.7071067811865476 + 0.7071067811865475im

julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im

julia> cos(1 + 2im)
2.0327230070196656 - 3.0518977991518im

julia> exp(1 + 2im)
-1.1312043837568135 + 2.4717266720048188im

julia> sinh(1 + 2im)
-0.4890562590412937 + 1.4031192506220405im

注意數學函數通常應用於實數就返回實數值,應用於複數就返回複數值。例如,當sqrt 應用於-1與-1 + 0im 會有不同的表現,雖然-1 == -1 + 0im:

julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]

julia> sqrt(-1 + 0im)
0.0 + 1.0im

從變量構建複數時,文本型數值係數記法不再適用。相反地,乘法必須顯式地寫出:

julia> a = 1; b = 2; a + b*im
1 + 2im

然而,我們並不推薦這樣做,而應改為使用更高效的complex 函數直接通過實部與虛部構建一個複數值:

julia> a = 1; b = 2; complex(a, b)
1 + 2im

這種結構避免了乘法和加法操作。

Inf和NaN在複數的實部和虛部傳播,如特殊浮點值部分所述:

julia> 1 + Inf*im
1.0 + Inf*im

julia> 1 + NaN*im
1.0 + NaN*im

有理數

Julia有一個有理數類型來表示整數的精確比例。使用//操作符構造有理函數,有理數的分子和分母如果有公因式,則可以化簡為最小項,使分母非負:

julia> 2//3
2//3

julia> 3//2
3//2

julia> 6//3
2//1

julia> 3//6
1//2

整數比率的規範化形式是唯一的,因此可以通過檢查分子和分母是否相等來測試有理值是否相等。有理值的標準化分子、分母可通過分子、分母函數提取:

julia> numerator(2//3)
2

julia> denominator(2//3)
3

分子和分母的直接比較通常是不必要的,因為標準算術和比較操作對分數值也有定義:

julia> 2//3 == 6//9
true

julia> 2//3 == 9//27
false

julia> 3//7 < 1//2
true

julia> 3//4 > 2//3
true

julia> 2//4 + 1//6
2//3

julia> 5//12 - 1//4
1//6

julia> 5//8 * 3//12
5//32

julia> 6//5 / 10//7
21//25

分數可以很容易地轉換成浮點數:

julia> float(3//4)
0.75

對任意整數值a 和b(除了a == 0 且b == 0 時),從分數到浮點數的轉換遵從以下的一致性:

julia> a = 1; b = 2;

julia> isequal(float(a//b), a/b)
true

Julia 接受構建無窮分數值:

julia> 5//0
1//0

julia> -3//0
-1//0

julia> typeof(ans)
Rational{Int64}

但不接受試圖構建一個NaN 分數值:

julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]

像往常一樣,類型提升系統使得分數可以輕鬆地同其它數值類型進行交互:

julia> 3//5 + 1
8//5

julia> 3//5 - 0.5
0.09999999999999998

julia> 2//7 * (1 + 2im)
2//7 + 4//7*im

julia> 2//7 * (1.5 + 2im)
0.42857142857142855 + 0.5714285714285714im

julia> 3//2 / (1 + 2im)
3//10 - 3//5*im

julia> 1//2 + 2im
1//2 + 2//1*im

julia> 1 + 2//3im
1//1 - 2//3*im

julia> 0.5 == 1//2
true

julia> 0.33 == 1//3
false

julia> 0.33 < 1//3
true

julia> 1//3 - 0.33
0.0033333333333332993

相關焦點

  • Julia(複數和有理數)
    本文轉載自【微信公眾號:雲深之無跡,ID:TT1827652464】經微信公眾號授權轉載,如需轉載與原文作者聯繫複數和有理數Julia附帶了預定義的類型,表示複數和有理數,並支持所有標準數學運算和基本函數。
  • 這裡有一份Julia極簡入門教程
    Julia 1.0 重磅發布》的文章,為各位讀者報導了有關新興程式語言 Julia 1.0 的有關情況,當時有不少讀者在評論區留言:有沒有教程?今天我們就為有這個需求的讀者朋友們帶來 Julia 極簡入門教程,希望可以幫到你!
  • Julia入門教程-算術運算
    julia> x = 123123julia> x+=1124julia> x124二元運算和位運算的複合賦值操作符有下面幾種:+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>=
  • Julia入門教程-變量
    UndefVarError: X not defined# 可以使用UTF-8編碼的unicode字符作為變量名julia> 變量="中文變量""中文變量"# 可以通過輸入\delta tab來輸入julia> δ="1.0""1.0"# 可以通過輸入\alpha tab來輸入julia> α=1.01.0可以通過輸入\alpha tab來輸入\hat tab_2julia
  • Julia(建設者)
    為此,這是的(略有修改)開頭rational.jl,它實現了Julia的有理數:julia> struct OurRational{T<:Integer} <: Realnum::Tden
  • Julia教程1:Julia學習資料與工作環境
    不過任何教程都不可能把所有的細節都寫出來,所以當碰到問題的時候,能夠找到權威的資料是最好不過的。幸運的是,Julia在documentation這方面對中國使用者還是非常友好的。下面可以總結一下:1、Julia Documentation。
  • 高中數學:數系的擴充和複數的概念
    在步入高中數學學習階段之前,我們只接觸實數,有理數,無理數都屬於實數。當我們進入高中之後,為了學習所需,就需要我們的數系得以擴充,因此我們遇到了複數。今天,就由我來為大家講解一下有關複數的知識。首先,還是請大家先來看一下複數的概念:形如:z=a+bi(a為實部,b為虛部,i為虛數單位)的數叫複數。其中實部a和虛部b都屬於實數(R)。下來,我們通過一張圖來觀察,複數、實數、有理數和整數的關係,以此加深大家對複數的理解。
  • 1 Julia簡介及安裝
    如線性代數、隨機數生成、快速傅立葉變換、字符串處理。豐富的用於創建或描述對象的類型語法高性能,接近於靜態編譯型語言。主要用於科學計算很多做算法的朋友應該都有這樣的經歷,在做一個項目時,先用Python/Matlab完成算法模型驗證,再用其他程式語言(如C++)來實現,而有了Julia,我們直接一步到位,模型驗證和實現是一起的。
  • 使用Pyhon+Flux+Julia實現手寫數字識別
    使用MNIST數據集對0到9之間的數字進行手寫數字識別是神經網絡的一個典型入門教程
  • 「數系的擴充和複數的概念」教學設計
    知識與技能目標通過對複數引進過程的探索,了解數系擴充的必要性,理解虛數單位及與實數的四則運算規則,理解並掌握複數的相關概念;會運用複數及其相關概念解決有關問題。2. 過程與方法目標讓學生經歷從已有的知識出發,共同探究數系擴充的必要性,通過觀察、比較、推導,由特殊到一般,引進虛數單位i的推導過程,並進行知識基本應用的操作實踐,領悟問題研究的基本思路與方法,體會類比和化歸的思想方法。3.
  • Julia CFD 00 系列說明
    github上也有julia改寫的CFD Python,項目地址https://github.com/Wallace-dyfq/CFD-Julia-12-steps--o-Navier-Stokes-Equations。然而Julia這幾年版本更新太快,這個項目最後更新於四年前,示例代碼中包含有大量新版本Julia廢棄的語法,導致很多代碼在新版本下沒辦法運行。
  • 趣味數學討論:2立方根是有理數
    這就是著名的「倍立方問題」也是有理數和無理數問題的探討首先我們肯定能作出任意整數的加減乘除,甚至開根號都可以做出來。假設2的立方根也可以做出來,所以它就可以寫成A/B的形式,這是數學上的常用假設方法,因為尺規作圖只能在加減乘除,開根號的框架下才能成立。
  • Julia CFD|00 系列說明
    github上也有julia改寫的CFD Python,項目地址https://github.com/Wallace-dyfq/CFD-Julia-12-steps--o-Navier-Stokes-Equations。
  • 有理數和無理數的區別 有理數和無理數區別
    在數學學科中,有有理數和無理數,那你知道有理數和無理數之間的區別嗎?下面就讓我們一起來了解一下吧。一、有理數和無理數性質上的區別:有理數:是指兩個整數的比,總能寫成整數、有限小數或者是無限循環小數。無理數:不能寫成兩個整數之比,是無限不循環小數。二、有理數和無理數結構上的區別:有理數:是整數和分數的統稱。
  • Julia的暗黑語法:Unicode輸入
    輸入 \sqrt+Tab,會輸入 √,這個符號已經是一個運算了,所以可以直接使用:julia> √21.4142135623730951julia> √2 * √22.0000000000000004可以看到這是數值運算,會有誤差的。
  • 有理數和無理數
    有理數是可以表述為分數的數。更準確地說,如果r = a/b,其中a和b都是整數,且b ≠ 0,則r是有理數。有理數包括,如23/58、-22/7、42 (42/1)。有理數之外的數被稱為無理數。你也許聽說過π = 3.14159……這是一個無理數,我們將在第8章討論它。對於下一個定理,回憶一下分數加法是有幫助的。兩個具有相同分母的分數比較容易相加。
  • 深入了解 Julia 中的數據結構
    在之前的 Julia 綜合教程迭代中,我們介紹了如何在類型和函數中使用 Julia 的多分派(multiple dispatch)。多分派是一種簡單的系統,用於在相同的方法參數下,將不同的類型應用於不同的函數調用。該結構中的關鍵組件是類型,更具體地說,是數據類型。
  • 《易經》中的「數,理,象」是什麼意思,明白這個就算入門了
    這裡是「說易解道」前面我們講了易經中的三個原則【變易,簡易,不易】當我們懂了這三個原則之後便可以開始學習三個內涵【數,理,象】這些基本的原則內涵理解之後,才能算得上是真正的易經入門,才能去研究易經。其中包含著世間萬物的觀點,人生也好,思想也好,都有它的原則和道理。根據我們現在的科學科學觀點來分析,易經中理代表的是哲學,世間萬物的存在都有它的道理,有它道理的同時也必然有它的相,反過來說世間萬物任何一種現象,也一定會有它的道理,但每個出現的現象又含有它一定的數。
  • 《有理數的加減法》說課
    一、教材分析:《有理數的減法》是新人教版版《數學》實驗教科書七年級上冊第一章第三節的內容.「數的運算」是「數與代數」學習領域的重要內容,減法是其中的一種基本運算.本課的學習遠接小學階段關於整數、分數(包括小數)的減法運算,近承第四節有理數的加法運算.通過對有理數的減法運算的學習,學生將對減法運算有進一步的認識和理解,為後繼諸如實數、複數的減法運算的學習奠定了堅實的基礎.
  • 從有理數到實數和數的連續體
    Dedekind是從上文提到的直線連續性公理出發,以有理數集為基礎來構造數的連續體的。他首先引入了一種有理數集的分割方式——把有理數集Q分成兩個非空集合A1和A2,也就有A1∪A2=Q,另外對於a1∈A1和a2∈A2,有a1<a2。