当前位置:   article > 正文

Python-VBA函数之旅-complex函数_vba complex

vba complex

目录

1、complex函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客


        complex函数创建的复数对象在Python中具有广泛的应用场景,特别是在处理涉及数学计算、信号处理、物理模拟、数据分析、电气工程和控制系统等领域的复杂问题时。常用的应用场景有:

1、数学计算:

1-1、解方程:复数在数学中常用于解决某些方程,如二次方程、多项式方程等,当这些方程的解不能表示为实数时,复数解就派上了用场。
1-2、三角学:在三角函数中,复数经常用于表示和计算角度和旋转。
1-3、傅里叶变换:在信号处理中,傅里叶变换是一种将信号从时域转换到频域的方法,而傅里叶变换的结果通常表示为复数形式。

2、物理模拟:

2-1、量子力学:在量子力学中,波函数通常表示为复数形式,描述粒子的概率分布。
2-2、电磁学:在处理交流电路时,复数常用于表示电压和电流的振幅和相位。

3、电气工程:

3-1、交流电路分析:在电气工程中,复数用于描述交流电路中的电压、电流和阻抗等参数,通过复阻抗和复功率的概念,可以简化交流电路的分析和计算。

4、控制系统:

4-1、频率响应分析:在控制系统中,复数用于描述系统的频率响应,从而分析系统的稳定性和性能。

5、编程与算法:

5-1、算法优化:在某些算法中,如快速傅里叶变换(FFT)等,复数运算可以显著提高计算效率。
5-2、图形处理:在图形渲染和计算机视觉中,复数有时用于表示和处理二维平面上的点和向量。

6、数据分析与可视化:

6-1、频谱分析:在信号处理中,可以使用复数来表示信号的频谱信息,并通过可视化工具进行展示和分析。此外,在数据分析和可视化领域,复数还可以用于表示具有幅度和相位的数据。

7、其他领域:

7-1、金融分析:在金融领域,复数可以用于分析金融市场中的波动性和趋势,特别是在金融时间序列分析和预测模型中。
7-2、游戏开发:在游戏开发中,复数可用于表示物体的位置、速度和方向,特别是在2D游戏中。

        注意,尽管复数在许多高级应用中非常有用,但并不是所有问题都需要用到复数。在大多数情况下,实数运算就足够了。然而,当遇到涉及波动、旋转、周期性变化或频率分析等问题时,复数就成了一个强大的工具。

1、complex函数:
1-1、Python:
  1. # 1.函数:complex
  2. # 2.功能:用于创建一个指定参数的复数形式,其格式为:real + imag * j
  3. # 3.语法:
  4. # 3-1、一个参数:
  5. # complex(real)
  6. # 这里,`real` 是一个实数,表示复数的实部,虚部默认为0
  7. # 3-2、两个参数:
  8. # complex(real, imag)
  9. # 这里,`real` 是复数的实部,`imag` 是复数的虚部
  10. # 4.参数:
  11. # 4-1. real(可选):int或float类型的数值;也可以是字符串形式的复数
  12. # 4-2. imag(可选):int或float类型的数值
  13. # 5.返回值:返回一个复数
  14. # 6.说明:
  15. # 6-1、当两个参数都不提供时,返回复数0j
  16. # 6-2、当real参数为int或float类型时,imag参数可为空,表示虚部为0;如果提供了imag参数,那么imag参数也必须是int或float类型的数值
  17. # 6-3、当real参数为字符串时,则不能同时提供imag参数.此时表示real参数的字符串参数,需要是一个能表示复数的字符串,否则会出现TypeError错误:
  18. # TypeError: can only concatenate str (not "complex") to str
  19. # print(complex('3'+4j))
  20. # imag参数与j之间不能出现空格,否则会出现SyntaxError错误:
  21. # SyntaxError: invalid syntax. Perhaps you forgot a comma?
  22. # print(complex(-3+4 j))
  23. # 7.示例:
  24. # 应用1:数学计算
  25. # 基本的数学运算
  26. c1 = complex(5, 11)
  27. c2 = complex(3, 6)
  28. print(c1 + c2)
  29. print(c1 - c2)
  30. print(c1 * c2)
  31. print(c1 / c2)
  32. print(abs(c1))
  33. print(c2 ** 2)
  34. print(c1 == c2)
  35. print(c1.real)
  36. print(c1.imag)
  37. # (8+17j)
  38. # (2+5j)
  39. # (-51+63j)
  40. # (1.8+0.06666666666666667j)
  41. # 12.083045973594572
  42. # (-27+36j)
  43. # False
  44. # 5.0
  45. # 11.0
  46. # 解方程 2x^2 + 3x + 1 = 0
  47. import cmath
  48. def solve_quadratic_equation(a, b, c):
  49. # 计算判别式
  50. discriminant = (b ** 2) - (4 * a * c)
  51. # 根据判别式的值计算解
  52. if discriminant > 0:
  53. # 两个不同的实数解
  54. root1 = (-b + cmath.sqrt(discriminant)) / (2 * a)
  55. root2 = (-b - cmath.sqrt(discriminant)) / (2 * a)
  56. return root1.real, root2.real
  57. elif discriminant == 0:
  58. # 一个实数解(重根)
  59. root = -b / (2 * a)
  60. return root.real, root.real
  61. else:
  62. # 两个复数解
  63. root1 = (-b + cmath.sqrt(discriminant)) / (2 * a)
  64. root2 = (-b - cmath.sqrt(discriminant)) / (2 * a)
  65. return root1, root2
  66. # 主函数
  67. if __name__ == '__main__':
  68. a = 2
  69. b = 3
  70. c = 1
  71. roots = solve_quadratic_equation(a, b, c)
  72. print("方程的解为:", roots)
  73. # 方程的解为: (-0.5, -1.0)
  74. # 计算复数 3 + 6j 的三角函数值
  75. import cmath
  76. def complex_trigonometric_functions(z):
  77. """
  78. 计算复数的正弦、余弦和正切值。
  79. 参数:
  80. z -- 复数
  81. 返回:
  82. 一个包含正弦值、余弦值和正切值的元组
  83. """
  84. # 计算正弦值
  85. sin_z = cmath.sin(z)
  86. # 计算余弦值
  87. cos_z = cmath.cos(z)
  88. # 计算正切值(注意:如果余弦值为0,正切值将是未定义的)
  89. try:
  90. tan_z = cmath.tan(z)
  91. except ValueError:
  92. tan_z = cmath.inf # 或者你可以选择返回一个特定的值或抛出异常
  93. return sin_z, cos_z, tan_z
  94. if __name__ == '__main__':
  95. z = complex(3, 6)
  96. sin_value, cos_value, tan_value = complex_trigonometric_functions(z)
  97. print(f"正弦值: {sin_value}")
  98. print(f"余弦值: {cos_value}")
  99. print(f"正切值: {tan_value}")
  100. # 正弦值: (28.466112195402218-199.69451226216125j)
  101. # 余弦值: (-199.6969662082171-28.465762393875067j)
  102. # 正切值: (-3.433535799139612e-06+0.9999882010834399j)
  103. # 傅里叶变换(注意:此程序运行前,需要确保已安装numpy库)
  104. import numpy as np
  105. def fourier_transform(signal):
  106. """
  107. 对一维信号进行傅里叶变换。
  108. 参数:
  109. signal -- 输入的一维信号(numpy数组)
  110. 返回:
  111. 变换后的频域信号(numpy数组)
  112. """
  113. # 使用numpy的fft模块进行傅里叶变换
  114. fourier_result = np.fft.fft(signal)
  115. # 通常我们需要频域信号的幅度谱,可以通过取绝对值然后除以信号长度来归一化
  116. spectrum = np.abs(fourier_result) / len(signal)
  117. return spectrum
  118. # 主函数
  119. if __name__ == '__main__':
  120. # 示例:创建一个简单的信号并进行傅里叶变换
  121. # 创建一个包含10个点的正弦波信号
  122. t = np.linspace(0, 1, 10, endpoint=False)
  123. signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 80 * t)
  124. # 进行傅里叶变换
  125. spectrum = fourier_transform(signal)
  126. # 打印变换后的频谱
  127. print(spectrum)
  128. # [1.24624571e-14 8.00483115e-15 7.93684046e-15 7.30225954e-15
  129. # 4.71842149e-15 2.87853896e-15 4.71842149e-15 7.30225954e-15
  130. # 7.93684046e-15 8.00483115e-15]
  131. # 应用2:物理模拟
  132. #一维粒子波函数(用高斯波函数作为示例)以及计算其概率分布
  133. import numpy as np
  134. import matplotlib.pyplot as plt
  135. def gaussian_wavefunction(x, x0, sigma):
  136. """
  137. 高斯波函数。
  138. 参数:
  139. x -- 位置数组
  140. x0 -- 波包中心位置
  141. sigma -- 波包宽度(标准差)
  142. 返回:
  143. 波函数在位置x处的值(复数)
  144. """
  145. return np.exp(-(x - x0) ** 2 / (2 * sigma ** 2)) / np.sqrt(2 * np.pi * sigma ** 2)
  146. def probability_distribution(wavefunction):
  147. """
  148. 计算波函数的概率分布。
  149. 参数:
  150. wavefunction -- 波函数(复数数组)
  151. 返回:
  152. 概率分布(实数数组),即波函数模的平方
  153. """
  154. return np.abs(wavefunction) ** 2
  155. if __name__ == '__main__':
  156. # 定义位置和波包参数
  157. x = np.linspace(-10, 10, 1000) # 位置范围
  158. x0 = 0 # 波包中心位置
  159. sigma = 1 # 波包宽度(标准差)
  160. # 计算波函数
  161. wavefunction = gaussian_wavefunction(x, x0, sigma)
  162. # 计算概率分布
  163. probability = probability_distribution(wavefunction)
  164. # 绘制概率分布图
  165. plt.plot(x, probability)
  166. plt.title('Particle Probability Distribution')
  167. plt.xlabel('Position (x)')
  168. plt.ylabel('Probability Density')
  169. plt.show()
  170. # 计算振幅为10V,相位为45度的复数电压
  171. import cmath # 导入cmath模块,用于复数运算
  172. import math
  173. def complex_voltage(amplitude, phase_degrees):
  174. """
  175. 计算给定振幅和相位的复数电压。
  176. 参数:
  177. amplitude -- 电压的振幅(实数)
  178. phase_degrees -- 电压的相位(以度为单位)
  179. 返回:
  180. 表示电压的复数
  181. """
  182. # 将相位从度转换为弧度
  183. phase_radians = math.radians(phase_degrees)
  184. # 使用振幅和相位计算复数电压
  185. complex_voltage_value = amplitude * cmath.exp(1j * phase_radians) # 使用欧拉公式计算复数电压
  186. return complex_voltage_value # 返回计算得到的复数电压
  187. # 主函数
  188. if __name__ == '__main__':
  189. amplitude = 10 # 电压振幅
  190. phase_degrees = 45 # 电压相位(度)
  191. # 调用函数获取复数电压
  192. complex_v = complex_voltage(amplitude, phase_degrees) # 调用函数并传入参数
  193. # 输出复数电压的实部和虚部
  194. print(f"复数电压: {complex_v}") # 打印复数电压
  195. print(f"实部(振幅): {complex_v.real}") # 打印实部(振幅)
  196. print(f"虚部(与实部垂直的分量): {complex_v.imag}") # 打印虚部(与实部垂直的分量)
  197. # 复数电压: (7.0710678118654755+7.0710678118654755j)
  198. # 实部(振幅): 7.0710678118654755
  199. # 虚部(与实部垂直的分量): 7.0710678118654755
  200. # 应用3:电气工程
  201. # 分析一个简单的串联电路,其中包含电阻、电感和电容
  202. import cmath
  203. def complex_impedance(r, xl, xc):
  204. """
  205. 计算复数阻抗。
  206. 参数:
  207. r (float): 电阻值(实数部分)
  208. xl(float): 感性阻抗值(虚数部分的正值,表示电感)
  209. xc(float): 容性阻抗值(虚数部分的负值,表示电容)
  210. 返回:
  211. complex: 复数阻抗
  212. """
  213. z = r + xl * 1j - xc * 1j # 1j 是虚数单位,相当于数学中的 i
  214. return z
  215. def complex_circuit_analysis(v_source, r, xl, xc):
  216. """
  217. 进行交流电路分析
  218. 参数:
  219. v_source(complex): 交流电压源(复数形式,包含幅度和相位)
  220. r (float): 电阻值
  221. xl(float): 感性阻抗值
  222. xc(float): 容性阻抗值
  223. 返回:
  224. tuple: 包含电流(I)、电压降在电阻(V_r)、电感(V_xl)和电容(V_xc)上的复数值
  225. """
  226. # 计算复数阻抗
  227. z = complex_impedance(r, xl, xc)
  228. # 计算电流
  229. I = v_source / z
  230. # 计算各元件上的电压降
  231. V_r = I * r
  232. V_xl = I * xl * 1j
  233. V_xc = I * (-xc * 1j) # 电容的阻抗是负虚数
  234. return I, V_r, V_xl, V_xc
  235. # 主函数
  236. if __name__ == '__main__':
  237. # 假设电压源为 10∠30° V,电阻为5Ω,电感为2Ω,电容为4Ω(这里用感抗和容抗的欧姆值表示)
  238. v_source = 10 * cmath.exp(30j * cmath.pi / 180) # 将角度转换为弧度,并计算复数形式的电压源
  239. r = 5
  240. xl = 2 * 3.14159 # 假设频率为50Hz,则XL = 2πfL
  241. xc = 1 / (4 * 3.14159 * 50) # 假设频率为50Hz,则XC = 1/(2πfC)
  242. # 进行电路分析
  243. I, V_r, V_xl, V_xc = complex_circuit_analysis(v_source, r, xl, xc)
  244. # 输出结果
  245. print(f"电流 I: {I}")
  246. print(f"电阻上的电压降 V_r: {V_r}")
  247. print(f"电感上的电压降 V_xl: {V_xl}")
  248. print(f"电容上的电压降 V_xc: {V_xc}")
  249. # 电流 I: (1.1590307297965583-0.45611080891732j)
  250. # 电阻上的电压降 V_r: (5.795153648982792-2.2805540445865997j)
  251. # 电感上的电压降 V_xl: (2.8658263123731262+7.282398700843139j)
  252. # 电容上的电压降 V_xc: (-0.0007259235115297031-0.0018446562565397752j)
  253. # 应用4:编程与算法
  254. # 图形处理
  255. from PIL import Image, ImageFilter, ImageEnhance
  256. def complex_image_processing(image_path, output_path, blur_radius=2, contrast=1.5):
  257. """
  258. 对图像进行复杂的处理,包括模糊和对比度调整。
  259. 参数:
  260. image_path(str): 输入图像的路径。
  261. output_path(str): 处理后图像的保存路径。
  262. blur_radius(int): 模糊半径,默认为2。
  263. contrast(loat): 对比度调整因子,默认为1.5。
  264. """
  265. # 打开图像
  266. image = Image.open(image_path)
  267. # 应用模糊效果
  268. blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_radius))
  269. # 调整对比度
  270. enhancer = ImageEnhance.Contrast(blurred_image)
  271. contrast_adjusted_image = enhancer.enhance(contrast)
  272. # 保存处理后的图像
  273. contrast_adjusted_image.save(output_path)
  274. print(f"处理后的图像已保存到 {output_path}")
  275. # 主函数
  276. if __name__ == '__main__':
  277. complex_image_processing('input.jpg', 'output.jpg', blur_radius=3, contrast=2.0)
  278. # 处理后的图像已保存到 output.jpg
  279. # 应用5:数据分析与可视化
  280. # 对复数数据进行基本分析,包括计算平均值和标准差,并绘制实部和虚部的直方图
  281. import numpy as np
  282. import matplotlib.pyplot as plt
  283. def complex_data_analysis(complex_data):
  284. """
  285. 对复数数据进行基本分析,包括计算平均值和标准差,并绘制实部和虚部的直方图
  286. 参数:
  287. complex_data(np.ndarray): 包含复数的NumPy数组
  288. 返回:
  289. tuple: 包含平均值、标准差和直方图的显示。
  290. """
  291. # 计算复数的平均值
  292. mean = np.mean(complex_data)
  293. # 计算复数的标准差(注意:这里计算的是复数的模的标准差)
  294. std_dev = np.std(np.abs(complex_data))
  295. # 绘制实部的直方图
  296. plt.figure(figsize=(12, 6))
  297. plt.subplot(1, 2, 1)
  298. plt.hist(complex_data.real, bins=30, label='Real Part')
  299. plt.title('Histogram of Real Part')
  300. plt.xlabel('Value')
  301. plt.ylabel('Frequency')
  302. plt.legend()
  303. # 绘制虚部的直方图
  304. plt.subplot(1, 2, 2)
  305. plt.hist(complex_data.imag, bins=30, label='Imaginary Part')
  306. plt.title('Histogram of Imaginary Part')
  307. plt.xlabel('Value')
  308. plt.ylabel('Frequency')
  309. plt.legend()
  310. # 显示直方图
  311. plt.show()
  312. # 返回平均值和标准差
  313. return mean, std_dev
  314. # 主函数
  315. if __name__ == '__main__':
  316. # 创建一个包含复数的NumPy数组(例如,从某种测量或模拟中获得)
  317. complex_data = np.random.rand(100) + 1j * np.random.rand(100) # 生成100个复数,实部和虚部均为0到1之间的随机数
  318. # 进行数据分析
  319. mean, std_dev = complex_data_analysis(complex_data)
  320. # 输出结果
  321. print(f"Mean: {mean}")
  322. print(f"Standard Deviation: {std_dev}")
  323. # Mean: (0.4750448862704986+0.5106351539289095j)
  324. # Standard Deviation: 0.28181417210939025
  325. # 应用6:金融分析
  326. # 模拟一个包含复数的金融分析函数,计算复利并加上一个虚部成分
  327. import cmath
  328. def complex_financial_analysis(principal, rate, periods, imaginary_component):
  329. """
  330. 模拟一个包含复数的金融分析函数,计算复利并加上一个虚部成分
  331. 参数:
  332. principal(float): 本金
  333. rate(float or complex): 利率(可以是实数或复数)
  334. periods(int): 期数
  335. imaginary_component(float): 虚部成分,可以模拟某种风险或不确定性
  336. 返回:
  337. complex: 计算得到的包含实部和虚部的复利结果。
  338. """
  339. # 初始化复数的实部和虚部
  340. real_part = principal
  341. imag_part = 0
  342. # 计算复利
  343. for _ in range(periods):
  344. real_part *= (1 + rate.real) # 实部增长
  345. imag_part += imaginary_component # 虚部增加不确定性或风险
  346. # 将实部和虚部组合成复数
  347. complex_result = complex(real_part, imag_part)
  348. return complex_result
  349. # 主函数
  350. if __name__ == '__main__':
  351. # 假设本金为1000,年利率为5%(表示为0.05的复数,虚部为0),投资10期
  352. # 虚部成分假设为每期增加0.1的不确定性或风险
  353. principal = 1000
  354. rate = 0.05 + 0j # 假设利率是实数,虚部为0
  355. periods = 10
  356. imaginary_component = 0.1 # 每期增加的虚部成分
  357. # 进行金融分析
  358. complex_result = complex_financial_analysis(principal, rate, periods, imaginary_component)
  359. # 输出结果
  360. print(f"金融分析结果为复数: {complex_result}")
  361. print(f"实部(本金加增长): {complex_result.real}")
  362. print(f"虚部(不确定性或风险): {complex_result.imag}")
  363. # 金融分析结果为复数: (1628.8946267774422+0.9999999999999999j)
  364. # 实部(本金加增长): 1628.8946267774422
  365. # 虚部(不确定性或风险): 0.9999999999999999
1-2、VBA
VBA很难模拟类型应用场景,略。

2、相关文章:

2-1、Python-VBA函数之旅-all()函数

2-2、Python-VBA函数之旅-any()函数 

2-3、Python-VBA函数之旅-ascii()函数 

2-4、Python-VBA函数之旅-bin()函数 

Python算法之旅Myelsa的Python算法之旅(高铁直达)-CSDN博客

Python函数之旅:Myelsa的Python函数之旅(高铁直达)

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/625214
推荐阅读
相关标签
  

闽ICP备14008679号