Complex.cpp
上传用户:weigute
上传日期:2007-03-02
资源大小:1287k
文件大小:12k
源码类别:

数学计算

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // Complex.h
  3. //
  4. // 操作复数的类 CComplex 的实现代码
  5. //
  6. // 周长发编制, 2002/8
  7. //////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "Complex.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. //////////////////////////////////////////////////////////////////////
  19. // 基本构造函数
  20. //////////////////////////////////////////////////////////////////////
  21. CComplex::CComplex() 
  22. {
  23. m_dblX = 0.0;
  24. m_dblY = 0.0;
  25. }
  26. //////////////////////////////////////////////////////////////////////
  27. // 指定值构造函数
  28. //
  29. // 参数:
  30. // 1. double dblX - 指定的实部
  31. // 2. double dblY - 指定的虚部
  32. //////////////////////////////////////////////////////////////////////
  33. CComplex::CComplex(double dblX, double dblY)
  34. {
  35. m_dblX = dblX;
  36. m_dblY = dblY;
  37. }
  38. //////////////////////////////////////////////////////////////////////
  39. // 拷贝构造函数
  40. //
  41. // 参数:
  42. // 1. const CComplex& other - 源复数
  43. //////////////////////////////////////////////////////////////////////
  44. CComplex::CComplex(const CComplex& other)
  45. {
  46. m_dblX = other.m_dblX;
  47. m_dblY = other.m_dblY;
  48. }
  49. //////////////////////////////////////////////////////////////////////
  50. // 指定复数的实部
  51. //
  52. // 参数:
  53. // 1. double dblX - 复数的实部
  54. //////////////////////////////////////////////////////////////////////
  55. void CComplex::SetReal(double dblX)
  56. {
  57. m_dblX = dblX;
  58. }
  59. //////////////////////////////////////////////////////////////////////
  60. // 指定复数的虚部
  61. //
  62. // 参数:
  63. // 1. double dblX - 复数的虚部
  64. //////////////////////////////////////////////////////////////////////
  65. void CComplex::SetImag(double dblY)
  66. {
  67. m_dblY = dblY;
  68. }
  69. //////////////////////////////////////////////////////////////////////
  70. // 取复数的实部
  71. //
  72. // 参数:  无
  73. //
  74. // 返回值:double 型,复数的实部
  75. //////////////////////////////////////////////////////////////////////
  76. double CComplex::GetReal()
  77. {
  78. return m_dblX;
  79. }
  80. //////////////////////////////////////////////////////////////////////
  81. // 取复数的虚部
  82. //
  83. // 参数:  无
  84. //
  85. // 返回值:double 型,复数的虚部
  86. //////////////////////////////////////////////////////////////////////
  87. double CComplex::GetImag()
  88. {
  89. return m_dblY;
  90. }
  91. //////////////////////////////////////////////////////////////////////
  92. // 将复数转化为"a+bj"形式的字符串
  93. //
  94. // 参数:  无
  95. //
  96. // 返回值:CString 对象,"a+bj"形式的字符串
  97. //////////////////////////////////////////////////////////////////////
  98. CString CComplex::ToString() const
  99. {
  100. CString s;
  101. if (m_dblX != 0.0)
  102. {
  103. if (m_dblY > 0)
  104. s.Format("%f + %fj", m_dblX, m_dblY);
  105. else if (m_dblY < 0)
  106. s.Format("%f - %fj", m_dblX, fabs(m_dblY));
  107. else
  108. s.Format("%f", m_dblX);
  109. }
  110. else
  111. {
  112. if (m_dblY > 0)
  113. s.Format("%fj", m_dblY);
  114. else if (m_dblY < 0)
  115. s.Format("-%fj", fabs(m_dblY));
  116. else
  117. s.Format("%f", m_dblX);
  118. }
  119. return s;
  120. }
  121. //////////////////////////////////////////////////////////////////////
  122. // 将"a,b"形式的字符串转化为复数,以a为复数的实部,b为复数的虚部
  123. //
  124. // 参数:
  125. // 1. CString s - "a,b"形式的字符串,a为复数的实部,b为复数的虚部
  126. // 2. const CString& sDelim - a, b之间的分隔符,默认为空格
  127. //
  128. // 返回值:无
  129. //////////////////////////////////////////////////////////////////////
  130. void CComplex::FromString(CString s, const CString& sDelim /*= " "*/)
  131. {
  132. int nPos = s.Find(sDelim);
  133. if (nPos == -1)
  134. {
  135. s.TrimLeft();
  136. s.TrimRight();
  137. m_dblX = atof(s);
  138. m_dblY = 0;
  139. }
  140. else
  141. {
  142. int nLen = s.GetLength();
  143. CString sLeft = s.Left(nPos);
  144. CString sRight = s.Right(nLen - nPos - 1);
  145. sLeft.TrimLeft();
  146. sRight.TrimRight();
  147. m_dblX = atof(sLeft);
  148. m_dblY = atof(sRight);
  149. }
  150. }
  151. //////////////////////////////////////////////////////////////////////
  152. // 重载运算符==,比较两个复数是否相等
  153. //
  154. // 参数:
  155. // 1. const CComplex& cpxX - 用于比较的复数
  156. //
  157. // 返回值:BOOL型,相等则为TRUE,否则为FALSE
  158. //////////////////////////////////////////////////////////////////////
  159. BOOL CComplex::operator==(const CComplex& cpxX) const
  160. {
  161. return (m_dblX == cpxX.m_dblX && m_dblY == cpxX.m_dblY); 
  162. }
  163. //////////////////////////////////////////////////////////////////////
  164. // 重载运算符!=,比较两个复数是否不等
  165. //
  166. // 参数:
  167. // 1. const CComplex& cpxX - 用于比较的复数
  168. //
  169. // 返回值:BOOL型,不相等则为TRUE,相等为FALSE
  170. //////////////////////////////////////////////////////////////////////
  171. BOOL CComplex::operator!=(const CComplex& cpxX) const
  172. {
  173. return (m_dblX != cpxX.m_dblX || m_dblY != cpxX.m_dblY); 
  174. }
  175. //////////////////////////////////////////////////////////////////////
  176. // 重载运算符=,给复数赋值
  177. //
  178. // 参数:
  179. // 1. const CComplex& cpxX - 用于给复数赋值的源复数
  180. //
  181. // 返回值:CComplex型的引用,所引用的复数与cpxX相等
  182. //////////////////////////////////////////////////////////////////////
  183. CComplex& CComplex::operator=(const CComplex& cpxX)
  184. {
  185. m_dblX = cpxX.m_dblX;
  186. m_dblY = cpxX.m_dblY;
  187. return *this;
  188. }
  189. //////////////////////////////////////////////////////////////////////
  190. // 重载运算符+,实现复数的加法
  191. //
  192. // 参数:
  193. // 1. const CComplex& cpxX - 与指定复数相加的复数
  194. //
  195. // 返回值:CComplex型,指定复数与cpxX相加之和
  196. //////////////////////////////////////////////////////////////////////
  197. CComplex CComplex::operator+(const CComplex& cpxX) const
  198. {
  199. double x = m_dblX + cpxX.m_dblX;
  200. double y = m_dblY + cpxX.m_dblY;
  201. return CComplex(x, y);
  202. }
  203. //////////////////////////////////////////////////////////////////////
  204. // 重载运算符-,实现复数的减法
  205. //
  206. // 参数:
  207. // 1. const CComplex& cpxX - 与指定复数相减的复数
  208. //
  209. // 返回值:CComplex型,指定复数减去cpxX之差
  210. //////////////////////////////////////////////////////////////////////
  211. CComplex CComplex::operator-(const CComplex& cpxX) const
  212. {
  213. double x = m_dblX - cpxX.m_dblX;
  214. double y = m_dblY - cpxX.m_dblY;
  215. return CComplex(x, y);
  216. }
  217. //////////////////////////////////////////////////////////////////////
  218. // 重载运算符*,实现复数的乘法
  219. //
  220. // 参数:
  221. // 1. const CComplex& cpxX - 与指定复数相乘的复数
  222. //
  223. // 返回值:CComplex型,指定复数与cpxX相乘之积
  224. //////////////////////////////////////////////////////////////////////
  225. CComplex CComplex::operator*(const CComplex& cpxX) const
  226. {
  227.     double x = m_dblX * cpxX.m_dblX - m_dblY * cpxX.m_dblY;
  228.     double y = m_dblX * cpxX.m_dblY + m_dblY * cpxX.m_dblX;
  229. return CComplex(x, y);
  230. }
  231. //////////////////////////////////////////////////////////////////////
  232. // 重载运算符/,实现复数的除法
  233. //
  234. // 参数:
  235. // 1. const CComplex& cpxX - 与指定复数相除的复数
  236. //
  237. // 返回值:CComplex型,指定复数除与cpxX之商
  238. //////////////////////////////////////////////////////////////////////
  239. CComplex CComplex::operator/(const CComplex& cpxX) const
  240. {
  241.     double e, f, x, y;
  242.     
  243.     if (fabs(cpxX.m_dblX) >= fabs(cpxX.m_dblY))
  244. {
  245.         e = cpxX.m_dblY / cpxX.m_dblX;
  246.         f = cpxX.m_dblX + e * cpxX.m_dblY;
  247.         
  248.         x = (m_dblX + m_dblY * e) / f;
  249.         y = (m_dblY - m_dblX * e) / f;
  250. }
  251.     else
  252.     {
  253. e = cpxX.m_dblX / cpxX.m_dblY;
  254.         f = cpxX.m_dblY + e * cpxX.m_dblX;
  255.         
  256.         x = (m_dblX * e + m_dblY) / f;
  257.         y = (m_dblY * e - m_dblX) / f;
  258.     }
  259. return CComplex(x, y);
  260. }
  261. //////////////////////////////////////////////////////////////////////
  262. // 计算复数的模
  263. //
  264. // 参数:无
  265. //
  266. // 返回值:double型,指定复数的模
  267. //////////////////////////////////////////////////////////////////////
  268. double CComplex::Abs() const
  269. {
  270.     // 求取实部和虚部的绝对值
  271.     double x = fabs(m_dblX);
  272.     double y = fabs(m_dblY);
  273.     if (m_dblX == 0)
  274. return y;
  275.     if (m_dblY == 0)
  276. return x;
  277.     
  278.     
  279.     // 计算模
  280.     if (x > y)
  281.         return (x * sqrt(1 + (y / x) * (y / x)));
  282.     
  283.     return (y * sqrt(1 + (x / y) * (x / y)));
  284. }
  285. //////////////////////////////////////////////////////////////////////
  286. // 计算复数的根
  287. //
  288. // 参数:
  289. // 1. int n - 待求根的根次
  290. // 2. CComplex cpxR[] - CComplex型数组,长度为n,返回复数的所有根
  291. //
  292. // 返回值:无
  293. //////////////////////////////////////////////////////////////////////
  294. void CComplex::Root(int n, CComplex cpxR[]) const
  295. {
  296. if (n<1) 
  297. return;
  298.     
  299. double q = atan2(m_dblY, m_dblX);
  300.     double r = sqrt(m_dblX*m_dblX + m_dblY*m_dblY);
  301.     if (r != 0)
  302.     { 
  303. r = (1.0/n)*log(r);
  304. r = exp(r);
  305. }
  306.     for (int k=0; k<=n-1; k++)
  307.     { 
  308. double t = (2.0*k*3.1415926+q)/n;
  309.         cpxR[k].m_dblX = r*cos(t); 
  310. cpxR[k].m_dblY = r*sin(t);
  311.     }
  312. }
  313. //////////////////////////////////////////////////////////////////////
  314. // 计算复数的实幂指数
  315. //
  316. // 参数:
  317. // 1. double dblW - 待求实幂指数的幂次
  318. //
  319. // 返回值:CComplex型,复数的实幂指数值
  320. //////////////////////////////////////////////////////////////////////
  321. CComplex CComplex::Pow(double dblW) const
  322. {
  323. // 常量
  324. const double PI = 3.14159265358979;
  325. // 局部变量
  326. double r, t;
  327.     
  328.     // 特殊值处理
  329.     if ((m_dblX == 0) && (m_dblY == 0))
  330. return CComplex(0, 0);
  331.     
  332.     // 幂运算公式中的三角函数运算
  333.     if (m_dblX == 0)
  334. {
  335.         if (m_dblY > 0)
  336.             t = 1.5707963268;
  337.         else
  338.             t = -1.5707963268;
  339. }
  340.     else
  341. {
  342.         if (m_dblX > 0)
  343.             t = atan2(m_dblY, m_dblX);
  344.         else
  345.         {
  346. if (m_dblY >= 0)
  347.                 t = atan2(m_dblY, m_dblX) + PI;
  348.             else
  349.                 t = atan2(m_dblY, m_dblX) - PI;
  350. }
  351.     }
  352.     
  353.     // 模的幂
  354.     r = exp(dblW * log(sqrt(m_dblX * m_dblX + m_dblY * m_dblY)));
  355.     
  356.     // 复数的实幂指数
  357.     return CComplex(r * cos(dblW * t), r * sin(dblW * t));
  358. }
  359. //////////////////////////////////////////////////////////////////////
  360. // 计算复数的复幂指数
  361. //
  362. // 参数:
  363. // 1. CComplex cpxW - 待求复幂指数的幂次
  364. // 2. int n - 控制参数,默认值为0。当n=0时,求得的结果为复幂指数的主值。
  365. //
  366. // 返回值:CComplex型,复数的复幂指数值
  367. //////////////////////////////////////////////////////////////////////
  368. CComplex CComplex::Pow(CComplex cpxW, int n /*= 0*/) const
  369. {
  370. // 常量
  371. const double PI = 3.14159265358979;
  372. // 局部变量
  373.     double r, s, u, v;
  374.     
  375.     // 特殊值处理
  376.     if (m_dblX == 0)
  377. {
  378.         if (m_dblY == 0)
  379. return CComplex(0, 0);
  380.             
  381.         s = 1.5707963268 * (fabs(m_dblY) / m_dblY + 4 * n);
  382. }
  383.     else
  384. {
  385.         s = 2 * PI * n + atan2(m_dblY, m_dblX);
  386.         
  387.         if (m_dblX < 0)
  388. {
  389.             if (m_dblY > 0)
  390.                 s = s + PI;
  391.             else
  392.                 s = s - PI;
  393.         }
  394.     }
  395.     
  396.     // 求幂运算公式
  397.     r = 0.5 * log(m_dblX * m_dblX + m_dblY * m_dblY);
  398.     v = cpxW.m_dblX * r + cpxW.m_dblY * s;
  399.     u = exp(cpxW.m_dblX * r - cpxW.m_dblY * s);
  400.     return CComplex(u * cos(v), u * sin(v));
  401. }
  402. //////////////////////////////////////////////////////////////////////
  403. // 计算复数的自然对数
  404. //
  405. // 参数:无
  406. //
  407. // 返回值:CComplex型,复数的自然对数值
  408. //////////////////////////////////////////////////////////////////////
  409. CComplex CComplex::Log() const
  410. {
  411. double p = log(sqrt(m_dblX*m_dblX + m_dblY*m_dblY));
  412.     return CComplex(p, atan2(m_dblY, m_dblX));
  413. }
  414. //////////////////////////////////////////////////////////////////////
  415. // 计算复数的正弦
  416. //
  417. // 参数:无
  418. //
  419. // 返回值:CComplex型,复数的正弦值
  420. //////////////////////////////////////////////////////////////////////
  421. CComplex CComplex::Sin() const
  422. {
  423. double p = exp(m_dblY); 
  424. double q = exp(-m_dblY);
  425.     double x = sin(m_dblX)*(p+q)/2.0; 
  426. double y = cos(m_dblX)*(p-q)/2.0;
  427. return CComplex(x, y);
  428. }
  429. //////////////////////////////////////////////////////////////////////
  430. // 计算复数的余弦
  431. //
  432. // 参数:无
  433. //
  434. // 返回值:CComplex型,复数的余弦值
  435. //////////////////////////////////////////////////////////////////////
  436. CComplex CComplex::Cos() const
  437. {
  438. double p = exp(m_dblY); 
  439. double q = exp(-m_dblY);
  440.     double x = cos(m_dblX)*(p+q)/2.0; 
  441. double y = -sin(m_dblX)*(p-q)/2.0;
  442. return CComplex(x, y);
  443. }
  444. //////////////////////////////////////////////////////////////////////
  445. // 计算复数的正切
  446. //
  447. // 参数:无
  448. //
  449. // 返回值:CComplex型,复数的正切值
  450. //////////////////////////////////////////////////////////////////////
  451. CComplex CComplex::Tan() const
  452. {
  453. return Sin()/Cos();
  454. }