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

数学计算

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // NLequation.h
  3. //
  4. // 求解线性方程组的类 CNLequation 的声明接口
  5. //
  6. // 周长发编制, 2002/8
  7. //////////////////////////////////////////////////////////////////////
  8. #if !defined(AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_)
  9. #define AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_
  10. #if _MSC_VER > 1000
  11. #pragma once
  12. #endif // _MSC_VER > 1000
  13. #include <math.h>
  14. // 需要调用复数和矩阵运算
  15. #include "Matrix.h"
  16. #include "Complex.h"
  17. // 类声明
  18. class CNLequation  
  19. {
  20. //
  21. // 公有接口函数
  22. //
  23. public:
  24. //
  25. // 构造与析构
  26. //
  27. CNLequation();
  28. virtual ~CNLequation();
  29. //
  30. // 虚函数:计算方程左端函数值,必须在引申类中覆盖该类函数
  31. //
  32. virtual double Func(double x)
  33. {
  34. return 0.0;
  35. }
  36. virtual double Func(int n, double x[])
  37. {
  38. return 0.0;
  39. }
  40. virtual void Func(double x, double y[])
  41. {
  42. }
  43. virtual double Func(double x, double y)
  44. {
  45. return 0.0;
  46. }
  47. virtual double Func(double x[], double y[])
  48. {
  49. return 0.0;
  50. }
  51.     virtual void FuncMJ(int n, double x[], double p[])
  52. {
  53. }
  54. //
  55. // 非线性方程求解算法
  56. //
  57. // 求非线性方程实根的对分法
  58. int GetRootBisect(int nNumRoots, double x[], double xStart, double xEnd, double dblStep, double eps = 0.000001);
  59. // 求非线性方程一个实根的牛顿法
  60. BOOL GetRootNewton(double* x, int nMaxIt = 60, double eps = 0.000001);
  61. // 求非线性方程一个实根的埃特金迭代法
  62. BOOL GetRootAitken(double* x, int nMaxIt = 60, double eps = 0.000001);
  63. // 求非线性方程一个实根的连分式解法
  64. BOOL GetRootPq(double* x, double eps = 0.000001);
  65. // 求实系数代数方程全部根的QR方法
  66. BOOL GetRootQr(int n, double dblCoef[], double xr[], double xi[], int nMaxIt = 60, double eps = 0.000001);
  67. // 求实系数代数方程全部根的牛顿下山法
  68. BOOL GetRootNewtonDownHill(int n, double dblCoef[], double xr[], double xi[]);
  69. // 求复系数代数方程全部根的牛顿下山法
  70. BOOL GetRootNewtonDownHill(int n, double ar[], double ai[], double xr[], double xi[]);
  71. // 求非线性方程一个实根的蒙特卡洛法
  72. void GetRootMonteCarlo(double* x, double xStart, int nControlB, double eps = 0.000001);
  73. // 求实函数或复函数方程一个复根的蒙特卡洛法
  74. void GetRootMonteCarlo(double* x, double* y, double xStart, int nControlB, double eps = 0.000001);
  75. //
  76. // 非线性方程组求解算法
  77. //
  78. // 求非线性方程组一组实根的梯度法
  79. BOOL GetRootsetGrad(int n, double x[], int nMaxIt = 500, double eps = 0.000001);
  80. // 求非线性方程组一组实根的拟牛顿法
  81. BOOL GetRootsetNewton(int n, double x[], double t, double h, int nMaxIt = 500, double eps = 0.000001);
  82. // 求非线性方程组最小二乘解的广义逆法
  83. BOOL GetRootsetGinv(int m, int n, double x[], double eps1 = 0.000001, double eps2 = 0.000001);
  84. // 求非线性方程组一组实根的蒙特卡洛法
  85. void GetRootsetMonteCarlo(int n, double x[], double xStart, int nControlB, double eps = 0.000001);
  86. //
  87. // 内部函数
  88. //
  89. private:
  90. void g60(double* t,double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* p,double* q,int* k,int* it);
  91. void g90(double xr[],double xi[],double dblCoef[],double* x,double* y,double* p,double* q,double* w,int* k);
  92. void g65(double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* dd,double* dc,double* c,int* k,int* is,int* it);
  93. void g60c(double* t,double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* p,double* q,int* k,int* it);
  94. void g90c(double xr[],double xi[],double ar[],double ai[],double* x,double* y,double* p,double* w,int* k);
  95. void g65c(double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* dd,double* dc,double* c,int* k,int* is,int* it);
  96. double rnd(double* r);
  97. };
  98. #endif // !defined(AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_)