?? vfunc.h
字號:
#ifndef VFUNC_H
#define VFUNC_H
#include <math.h>
#include "matrix.h"
class valgo // 矩陣算法類
{
private:
DOUBLE yfactor; // 乘因子,初始化為1
DOUBLE xfactor; // x軸放大因子,初始化為1
DOUBLE addconst; // 加和,初始化為0
DOUBLE xshift; // x平移量,初始化為0
public:
unsigned refnum; // 引用數,初始化為1
valgo():refnum(1),yfactor(1.0),xfactor(1.0),addconst(0.0),xshift(0.0){};
// 構造函數,產生y=x線性函數
valgo(DOUBLE xs, DOUBLE xf,DOUBLE adc=0, DOUBLE yf=1):refnum(1),yfactor(yf),
addconst(adc),xshift(xs),xfactor(xf){}; // 為子類的調用而存在的構造函數
valgo(DOUBLE a):refnum(1),yfactor(0.0),xfactor(1.0),addconst(a),xshift(0.0){};
// 常函數的構造,輸出結構與輸入矩陣同樣階數的常數矩陣
valgo(valgo & alg):yfactor(alg.yfactor),xfactor(alg.xfactor),
addconst(alg.addconst),xshift(alg.xshift),refnum(1){}; // 拷貝構造函數
virtual ~valgo(){};
matrix cal(matrix & x); // 計算算法值
virtual matrix& calculate(matrix & x)
{return x;}; // 本身算法,將被繼承子類改寫, 返回的引用須與x同
virtual valgo * clone(); // 克隆自己,必須被繼承子類改寫
valgo * mul(DOUBLE a); // 乘a
valgo * add(DOUBLE a); // 加a
valgo * neg(); // 取負
valgo * setxfactor(DOUBLE x); // 設置x軸因子
valgo * xroom(DOUBLE x); // 將xfactor擴大x倍
valgo * setxshift(DOUBLE x); // 設置xshift的值
valgo * xshiftas(DOUBLE x); // 從當前開始平移x
};
#ifndef FUNC_H
enum method {cadd,csub,cmul,cdiv,cpow,ccom}; // 枚舉加減乘除乘方復合這四種運算
#endif
class valgojoin : public valgo // 結合算法
{
public:
valgo * leftalgo; // 左算法,初始化為0
valgo * rightalgo; // 右算法,初始化為0
method met; // 指明算法
valgojoin(valgo * l, valgo * r, method m):leftalgo(l),
rightalgo(r), met(m)
{ if(leftalgo)
leftalgo->refnum++;
if(rightalgo)
rightalgo->refnum++;
};
valgojoin(valgojoin& alg):valgo(alg),
leftalgo(alg.leftalgo),rightalgo(alg.rightalgo),met(alg.met){
if(leftalgo)
leftalgo->refnum++;
if(rightalgo)
rightalgo->refnum++;};
// 拷貝構造函數
virtual ~valgojoin() {
if(leftalgo) { // 如左或者右算法已經沒有被引用,則刪除
leftalgo->refnum--;
if(!leftalgo->refnum) delete leftalgo;
}
if(rightalgo) {
rightalgo->refnum--;
if(!rightalgo->refnum) delete rightalgo;
}
};
virtual valgo * clone(); // 克隆自己
virtual matrix& calculate(matrix& x); // 實施結合算法
};
class valgofun : public valgo // 函數算法
{
public:
matrix& (*f)(matrix&); // 函數指針
valgofun(matrix& (*fun)(matrix&)):f(fun){}; // 用函數指針進行初始化
valgofun(valgofun& alg):valgo(alg),f(alg.f){}; // 拷貝構造函數
virtual matrix& calculate(matrix& x); // 實施函數算法
virtual valgo * clone(); // 克隆自己
};
class valgofun1 : public valgo // 標量到向量的函數算法
{
public:
matrix (*f)(DOUBLE); // 標量到向量的函數指針
valgofun1(matrix (*fun)(DOUBLE)):f(fun){}; // 用函數指針進行初始化
valgofun1(valgofun1& alg):valgo(alg),f(alg.f){}; // 拷貝構造函數
virtual matrix& calculate(matrix& x); // 實施函數算法
virtual valgo * clone(); // 克隆自己
};
class valgodiff : public valgo // 微分方程組函數算法
{
public:
matrix (*f)(DOUBLE,matrix&); // 表示f(t,y)的函數指針,y為向量
DOUBLE t0; // 初始變量
matrix y0; // 初值或稱邊界條件
DOUBLE tnow; // 最近值
matrix ynow; // 最近算得的y值
valgodiff(matrix (*fun)(DOUBLE,matrix&), DOUBLE tt0, matrix& yy0):
f(fun),t0(tt0),y0(yy0),tnow(tt0),ynow(yy0){};
valgodiff(valgodiff& alg):valgo(alg),f(alg.f),t0(alg.t0),y0(alg.y0),
tnow(alg.tnow),ynow(alg.ynow){}; // 拷貝構造函數
virtual matrix& calculate(matrix& x); // 實施函數算法
virtual valgo * clone(); // 克隆自己
matrix& calcul(DOUBLE t, DOUBLE eps=defaulterr); // 標量算法
};
class vfunc { // 矩陣函數類
public:
valgo * alg; // 決定函數的算法
vfunc(); // 缺省構造函數
vfunc(DOUBLE a); // 常函數的構造函數
vfunc(matrix& (*fun)(matrix&)); // 函數指針的構造函數
vfunc(matrix (*fun)(DOUBLE t)); // 標量到向量的函數指針構造函數
vfunc(vfunc & fn); // 拷貝構造函數
vfunc(valgo * a):alg(a){} // 算法構造函數,使用要小心,不能將一個算法產生
// 兩個函數,除非自己控制引用數的增加
virtual ~vfunc() { // 析構函數
if(alg) {
alg->refnum--; // 引用數減一,如再無其它引用,則刪除算法
if(!alg->refnum)
delete alg;
}
};
matrix operator()(matrix& x){return alg->cal(x);}; // 計算x的函數值
vfunc& operator=(vfunc& fn); // 賦值運算符
vfunc& operator=(matrix& (*fn)(matrix&)); // 用函數指針的賦值運算符
vfunc& operator=(DOUBLE a); // 常函數的賦值運算符
vfunc& operator+=(vfunc& fn); // 自身加一個函數
vfunc& operator+=(DOUBLE a){alg=alg->add(a);return (*this);};//自身加一個常數
vfunc& operator+=(matrix& (*f)(matrix&)); // 自身加一個函數指針
vfunc operator+(vfunc& fn); // 相加產生新函數
vfunc operator+(DOUBLE a); // 與常數相加產生新函數
friend vfunc operator+(DOUBLE a, vfunc& f); // 同上但常數在前
vfunc operator+(matrix& (*f)(matrix&)); // 加一個函數指針產生新函數
friend vfunc operator+(matrix& (*f)(matrix&),vfunc& fn);
// 同上但函數指針在前
vfunc& neg(); // 自身取負
vfunc operator-(); // 產生負函數
vfunc& operator-=(vfunc& fn); // 自身減一個函數
vfunc& operator-=(DOUBLE a){alg=alg->add(-a);return (*this);};
//自身減一個常數
vfunc& operator-=(matrix& (*f)(matrix&)); // 自身減一個函數指針
vfunc operator-(vfunc& fn); // 相減產生新函數
vfunc operator-(DOUBLE a); // 與常數相減產生新函數
friend vfunc operator-(DOUBLE a, vfunc& f); // 同上但常數在前
vfunc operator-(matrix& (*f)(matrix&)); // 減一個函數指針產生新函數
friend vfunc operator-(matrix& (*f)(matrix&),vfunc& fn); // 函數指針減函數
vfunc& operator*=(vfunc& fn); // 自身乘一個函數
vfunc& operator*=(DOUBLE a){alg=alg->mul(a);return (*this);};//自身乘一個常數
vfunc& operator*=(matrix& (*f)(matrix&)); // 自身乘一個函數指針
vfunc operator*(vfunc& fn); // 相乘產生新函數
vfunc operator*(DOUBLE a); // 與常數相乘產生新函數
friend vfunc operator*(DOUBLE a, vfunc& f); // 同上但常數在前
vfunc operator*(matrix& (*f)(matrix&)); // 乘一個函數指針產生新函數
friend vfunc operator*(matrix& (*f)(matrix&),vfunc& fn); // 函數指針乘函數
vfunc& operator/=(vfunc& fn); // 自身除以一個函數
vfunc& operator/=(DOUBLE a){alg=alg->mul(1.0/a);return (*this);
};//自身除以常數
vfunc& operator/=(matrix& (*f)(matrix&)); // 自身除以一個函數指針
vfunc operator/(vfunc& fn); // 相除產生新函數
vfunc operator/(DOUBLE a); // 與常數相除產生新函數
friend vfunc operator/(DOUBLE a, vfunc& f); // 常數除以函數
vfunc operator/(matrix& (*f)(matrix&)); // 除以一個函數指針產生新函數
friend vfunc operator/(matrix& (*f)(matrix&),vfunc& fn); // 函數指針除以函數
vfunc operator()(vfunc & fn); // 復合函數,產生新的函數
void setxfactor(DOUBLE a); // 設置x因子為a
void xroom(DOUBLE a); // x方向擴大a倍
void setxshift(DOUBLE a); // 設置函數沿x軸平移a
void shiftxas(DOUBLE a); // 函數沿x軸右移a
};
class vfuncdiff : public vfunc // 微分方程函數
{
public:
vfuncdiff(matrix (*fun)(DOUBLE,matrix&), DOUBLE t0, matrix& y0):
vfunc(new valgodiff(fun,t0,y0)){}; // 構造函數,fun為微分方程右端函數
// 的函數指針,t0起始時間,y0為起始值
matrix& operator()(DOUBLE t) {
return ((valgodiff*)alg)->calcul(t); };
};
class linemodel // 線性動態觀測系統模型
// 用作測試卡爾曼濾波器而產生仿真觀測數據
{
public:
matrix x; // 當前狀態變量
matrix a; // 當前狀態轉移矩陣
matrix h; // 當前觀測矩陣
gassvector w; // 模型噪聲源
gassvector v; // 觀測噪聲源
matrix y; // 當前觀測向量
linemodel(matrix& va, matrix & vh, matrix & q, matrix & r, matrix & vx);
// 構造函數,va初始狀態轉移矩陣,vh初始觀測矩陣,q當前模型噪聲協
// 方差陣,r當前觀測噪聲協方差陣,vx初始狀態變量
void setdata(matrix& va, matrix & vh, matrix & q, matrix & r);
void seta(matrix& va);
void seth(matrix& vh);
void setq(matrix& q);
void setr(matrix& r);
matrix & next(); // 計算下一級x值并返回新的x對應的y值
};
class kalman // 卡爾曼濾波類
{
public:
matrix x; // 當前狀態變量的估值
matrix p; // 當前估值的誤差協方差陣
matrix a; // 當前狀態轉移矩陣
matrix h; // 當前觀測矩陣
matrix y; // 當前觀測向量
matrix q; // 當前模型噪聲協方差陣
matrix r; // 當前觀測噪聲協方差陣
kalman(matrix &va,matrix& vq,matrix& vr,matrix& vh,matrix& vx,matrix& vp);
// 構造函數,va為狀態轉移矩陣,vh觀測矩陣,vq模型噪聲協方差陣,
// vr當前觀測噪聲協方差陣,vx初始狀態變量估值,vp初始估值協方差陣
void setdata(matrix &va,matrix& vq,matrix& vr,matrix& vh);
// 為時變系統隨時設置系統參數,va為狀態轉移矩陣,vh觀測矩陣,vq模型噪
// 聲協方差陣,vr當前觀測噪聲協方差陣
void seta(matrix& va);
void seth(matrix& vh);
void setq(matrix& vq);
void setr(matrix& vr);
matrix& next(matrix& y); // 根據下一個觀測值獲得新的狀態變量的估值
};
inline vfunc operator+(DOUBLE a, vfunc& f) // 常數加函數
{ return f+a; }
inline vfunc operator+(matrix& (*f)(matrix&),vfunc& fn) // 函數指針加函數
{ return fn+f;}
vfunc operator-(DOUBLE a, vfunc& f); // 常數減函數
vfunc operator-(matrix& (*f)(matrix&),vfunc& fn); // 函數指針減函數
inline vfunc operator*(DOUBLE a, vfunc& f) // 常數乘函數
{ return f*a; }
inline vfunc operator*(matrix& (*f)(matrix&),vfunc& fn) // 函數指針乘函數
{ return fn*f;}
vfunc operator/(DOUBLE a, vfunc& f); // 常數除以函數
vfunc operator/(matrix& (*f)(matrix&),vfunc& fn); // 函數指針除以函數
class regress // 多元線性回歸分析類
{
public:
matrix a; // 算出的回歸系數m+1維向量
matrix v; // 算出的偏相關系數m維向量
DOUBLE q; // 偏差平方和
DOUBLE s; // 平均標準偏差
DOUBLE r; // 復相關系數
DOUBLE u; // 回歸平方和
regress(matrix& x, matrix& y); // x為mXn維矩陣,y為n個觀測值
DOUBLE operator()(matrix& x); // 回歸后的線性函數,x是自變量
};
#endif // VFUNC_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -