-
Notifications
You must be signed in to change notification settings - Fork 0
/
complex.go
186 lines (174 loc) · 4.39 KB
/
complex.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package numgo
import (
"math"
)
const (
_RealDiff = 1e-6
PI = 3.141592653589793
)
/***********************************************
功能:实数除以一个复数
输入:
r:float64:实数
cmp:complex128:复数
输出:
complex128;复数
说明:如果被除数为0,输出结果为0
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexDivByReal(r float64, cmp complex128) complex128 {
// c_r := real(cmp)
// c_i := imag(cmp)
// return complex(c_r*r, -1*c_i*r) / (cmp * complex(c_r, -1*c_i))
r_c := Real2Complex(r)
if cmp != 0 {
return r_c / cmp
}
return cmp
}
/***********************************************
功能:复数加上一个实数
输入:
r:float64:实数
cmp:complex128:复数
输出:
complex128;复数
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexAddReal(r float64, cmp complex128) complex128 {
return complex(real(cmp)+r, imag(cmp))
}
/***********************************************
功能:复数减去一个实数
输入:
r:float64:实数
cmp:complex128:复数
输出:
complex128;复数
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexSubReal(r float64, cmp complex128) complex128 {
return complex(real(cmp)-r, imag(cmp))
}
/***********************************************
功能:实数减去一个复数
输入:
r:float64:实数
cmp:complex128:复数
输出:
complex128;复数
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexSubByReal(r float64, cmp complex128) complex128 {
//return complex(r-real(cmp), -imag(cmp))
return Real2Complex(r) - cmp
}
/***********************************************
功能:实数乘以一个复数
输入:
r:float64:实数
cmp:complex128:复数
输出:
complex128;复数
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexMulReal(r float64, cmp complex128) complex128 {
return complex(real(cmp)*r, imag(cmp)*r)
}
/***********************************************
功能:比较两个复数是否相等
输入:
a,b:complex128:复数
输出:
如果两个复数的实部和虚部都相等,返回true,否则返回false
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexsIsEqual(a, b complex128) bool {
if math.Abs(real(a)-real(b)) > _RealDiff {
return false
}
if math.Abs(imag(a)-imag(b)) > _RealDiff {
return false
}
return true
}
/***********************************************
功能:实数转换为复数
输入:
a:float64 实数
输出:
complex128
说明:
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func Real2Complex(a float64) complex128 {
return ComplexMulReal(a, 1+0i)
}
/***********************************************
功能:返回复数的共轭复数
输入:
cmp:complex128 复数
输出:
complex128
说明:复数 a+ib 的共轭复数是 a-ib
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexConjugate(cmp complex128) complex128 {
return complex(real(cmp), -imag(cmp))
}
/***********************************************
功能:返回复数的角度(主值)
输入:
cmp:complex128 复数
输出:
float64,角度的主值
说明:复数Z=a+bi化成三角式r(cosθ+isinθ),可简写作r∠θ,
其中模(绝对值)r=√(a²+b²);复角θ由tanθ=b/a解出并在0≤θ<360°范围内取值(主值)
编辑:wang_jp
时间:2020年10月16日
***********************************************/
func ComplexAngle(cmp complex128) float64 {
if real(cmp) == 0 {
return PI / 2
}
return math.Atan(imag(cmp) / real(cmp))
}
/***********************************************
功能:单位根
输入:n,k int
inv int:可选,用于对单位根取共轭。-1或者1,不填写时默认为1
输出:
complex128,单位根
说明:单位根指模为1的根,一般的x的n个单位根可以表示为:x=cos(2*pi*k/n)+sin(2*pi*k/n)i,
其中:k=0,1,2,..,n-1,i是虚数单位
编辑:wang_jp
时间:2020年11月9日
***********************************************/
func UnitRoot(n, k int, inv ...int) complex128 {
if n == 0 {
return 0
}
fk := float64(k)
fn := float64(n)
var invs float64 = 1.0
if len(inv) > 0 {
if inv[0] < 0 {
invs = -1
}
}
theta := 2 * fk * PI / fn
return complex(math.Cos(theta), invs*math.Sin(theta))
}