首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-complex函数

  • 25-03-03 04:30
  • 2333
  • 5612
blog.csdn.net

目录

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/微信:

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览61139 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/137733447"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top