⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nlequation.h

📁 科学与工程数值算法求解方程组的类
💻 H
字号:
//////////////////////////////////////////////////////////////////////
// NLequation.h
//
// 求解线性方程组的类 CNLequation 的声明接口
//
// 周长发编制, 2002/8
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_)
#define AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <math.h>

// 需要调用复数和矩阵运算
#include "Matrix.h"
#include "Complex.h"

// 类声明
class CNLequation  
{
	//
	// 公有接口函数
	//
public:

	//
	// 构造与析构
	//

	CNLequation();
	virtual ~CNLequation();

	//
	// 虚函数:计算方程左端函数值,必须在引申类中覆盖该类函数
	//

	virtual double Func(double x)
	{
		return 0.0;
	}
	virtual double Func(int n, double x[])
	{
		return 0.0;
	}
	virtual void Func(double x, double y[])
	{
	}
	virtual double Func(double x, double y)
	{
		return 0.0;
	}
	virtual double Func(double x[], double y[])
	{
		return 0.0;
	}
    virtual void FuncMJ(int n, double x[], double p[])
	{
	}

	//
	// 非线性方程求解算法
	//

	// 求非线性方程实根的对分法
	int GetRootBisect(int nNumRoots, double x[], double xStart, double xEnd, double dblStep, double eps = 0.000001);
	// 求非线性方程一个实根的牛顿法
	BOOL GetRootNewton(double* x, int nMaxIt = 60, double eps = 0.000001);
	// 求非线性方程一个实根的埃特金迭代法
	BOOL GetRootAitken(double* x, int nMaxIt = 60, double eps = 0.000001);
	// 求非线性方程一个实根的连分式解法
	BOOL GetRootPq(double* x, double eps = 0.000001);
	// 求实系数代数方程全部根的QR方法
	BOOL GetRootQr(int n, double dblCoef[], double xr[], double xi[], int nMaxIt = 60, double eps = 0.000001);
	// 求实系数代数方程全部根的牛顿下山法
	BOOL GetRootNewtonDownHill(int n, double dblCoef[], double xr[], double xi[]);
	// 求复系数代数方程全部根的牛顿下山法
	BOOL GetRootNewtonDownHill(int n, double ar[], double ai[], double xr[], double xi[]);
	// 求非线性方程一个实根的蒙特卡洛法
	void GetRootMonteCarlo(double* x, double xStart, int nControlB, double eps = 0.000001);
	// 求实函数或复函数方程一个复根的蒙特卡洛法
	void GetRootMonteCarlo(double* x, double* y, double xStart, int nControlB, double eps = 0.000001);

	//
	// 非线性方程组求解算法
	//

	// 求非线性方程组一组实根的梯度法
	BOOL GetRootsetGrad(int n, double x[], int nMaxIt = 500, double eps = 0.000001);
	// 求非线性方程组一组实根的拟牛顿法
	BOOL GetRootsetNewton(int n, double x[], double t, double h, int nMaxIt = 500, double eps = 0.000001);
	// 求非线性方程组最小二乘解的广义逆法
	BOOL GetRootsetGinv(int m, int n, double x[], double eps1 = 0.000001, double eps2 = 0.000001);
	// 求非线性方程组一组实根的蒙特卡洛法
	void GetRootsetMonteCarlo(int n, double x[], double xStart, int nControlB, double eps = 0.000001);

	//
	// 内部函数
	//
private:
	void g60(double* t,double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* p,double* q,int* k,int* it);
	void g90(double xr[],double xi[],double dblCoef[],double* x,double* y,double* p,double* q,double* w,int* k);
	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);
	void g60c(double* t,double* x,double* y,double* x1,double* y1,double* dx,double* dy,double* p,double* q,int* k,int* it);
	void g90c(double xr[],double xi[],double ar[],double ai[],double* x,double* y,double* p,double* w,int* k);
	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);
	double rnd(double* r);
};

#endif // !defined(AFX_NLEQUATION_H__72143033_E39F_404E_9A3B_F870E603EEE2__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -