?? func.cpp
字號:
#include <values.h>
#include <math.h>
#include <stdio.h>
#include "func.h"
DOUBLE algo::cal(DOUBLE x) { // 基類的基本算法
return yfactor*calculate(xfactor*(x-xshift))+addconst;
}
algo * algo::clone() // 克隆自己,必須被繼承子類改寫
{
return new algo(*this);
}
algo * algo::mul(DOUBLE a) // 乘a
{
algo * alg;
alg = this;
if(refnum>1) { refnum--;
alg = clone(); // 如引用數大于1,則產生新的對象
}
alg->yfactor *= a;
alg->addconst *= a;
return alg;
}
algo * algo::add(DOUBLE a) // 加a
{
algo * alg;
alg = this;
if(refnum>1) { refnum--;
alg = clone(); // 如引用數大于1,則產生新的對象
}
alg->addconst += a;
return alg;
}
algo * algo::neg() // 取負
{
algo * alg;
alg = this;
if(refnum>1) { refnum--;
alg = clone(); // 如引用數大于1,則產生新的對象
}
alg->addconst = -alg->addconst;
alg->yfactor = -alg->yfactor;
return alg;
}
algo * algo::setxfactor(DOUBLE x) // 設置x軸因子
{
algo * alg;
alg = this;
if(refnum>1) { refnum--;
alg = clone(); // 如引用數大于1,則產生新的對象
}
alg->xfactor = x;
return alg;
}
algo * algo::xroom(DOUBLE x) // 將xfactor擴大x倍
{
algo * alg;
alg = setxfactor(x*xfactor);
if(x!=0)alg->xshift/=x;
return alg;
}
algo * algo::setxshift(DOUBLE x) // 設置xshift的值
{
algo * alg;
alg = this;
if(refnum>1) { refnum--;
alg = clone(); // 如引用數大于1,則產生新的對象
}
alg->xshift = x;
return alg;
}
algo * algo::xshiftas(DOUBLE x) // 從當前開始平移x
{
return setxshift(xshift+x);
}
algo * algojoin::clone() // 克隆自己
{
return new algojoin(*this);
}
DOUBLE algojoin::calculate(DOUBLE x) // 實施結合算法
{
if(leftalgo==0 || rightalgo==0)
throw TMESSAGE("empty algo pointor!");
DOUBLE a,b;
if(met == ccom) // 復合函數
return leftalgo->cal(rightalgo->cal(x));
a = leftalgo->cal(x);
b = rightalgo->cal(x);
if(met == cadd) // 返回各結合運算值
return a+b;
else if(met == csub)
return a-b;
else if(met == cmul)
return a*b;
else if(met == cdiv)
return a/b;
else if(met == cpow)
return pow(a,b);
return 0.0;
}
algo * algofun::clone() // 克隆自己
{
return new algofun(*this);
}
DOUBLE algofun::calculate(DOUBLE x) // 實施函數算法
{
if(f)
return f(x);
return 0.0;
}
func::func()// 缺省構造函數,產生函數f(x)=x;
{
alg = new algo();
}
func::func(func & fn) // 拷貝構造函數
{
alg = fn.alg;
alg->refnum++;
}
func::func(DOUBLE (*fun)(DOUBLE)) // 函數指針的構造函數
{
alg = new algofun(fun);
}
func::func(DOUBLE a) // 常函數構造函數
{
alg = new algo(a);
}
func::func(algo * a) // 算法的構造函數
{
if(a)
alg = a;
}
func::func(algo& a) // 另一種算法構造函數
{
alg = a.clone(); // 克隆出一個同樣的算法變量并將指針賦予alg.
}
func& func::operator=(func& fn) // 賦值運算符
{
if(this == &fn) return (*this); // 如果等于自己,干脆啥也別做
if(alg) {
alg->refnum--; // 原算法引用數減1
if(!alg->refnum) // 如結果為0則刪除原算法
delete alg;
}
alg = fn.alg; // 將fn的算法移過來
if(alg) alg->refnum++; // 引用數增加
return (*this);
}
func& func::operator=(DOUBLE (*fn)(DOUBLE)) // 用函數指針的賦值運算符
{
if(alg) {
alg->refnum--; // 原算法引用數減1
if(!alg->refnum) // 如結果為0則刪除原算法
delete alg;
}
alg = new algofun(fn);
return (*this);
}
func& func::operator=(DOUBLE a) // 常函數的賦值運算符
{
if(alg) {
alg->refnum--; // 原算法引用數減1
if(!alg->refnum) // 如結果為0則刪除原算法
delete alg;
}
alg = new algo(a);
return (*this);
}
func& func::operator+=(func& fn) // 自身加一個函數
{
algo * a = new algojoin(alg, fn.alg, cadd);
alg->refnum--; // 因為聯合算法對兩個算法都加了引用數,因此再減回來
alg = a; // 將新指針賦給alg
return (*this);
}
func& func::operator+=(DOUBLE (*f)(DOUBLE)) // 自身加一個函數指針
{
func fn(f); // 將函數指針包裝為函數類
operator+=(fn); // 實施加操作
return (*this);
}
func func::operator+(func& fn) // 相加產生新函數
{
algo * a = new algojoin(alg, fn.alg, cadd);
func f(a);
return f;
}
func func::operator+(DOUBLE a) // 與常數相加產生新函數
{
func f(*this);
f += a;
return f;
}
func func::operator+(DOUBLE (*f)(DOUBLE)) // 加一個函數指針產生新函數
{
func ff(*this);
ff += f;
return ff;
}
func& func::neg() // 自身取負
{
alg=alg->neg();
return (*this);
}
func func::operator-() // 產生負函數
{
func f(*this);
f.neg();
return f;
}
func& func::operator-=(func& fn) // 自身減一個函數
{
algo * a = new algojoin(alg, fn.alg, csub);
alg->refnum--; // 因為聯合算法對兩個算法都加了引用數,因此再減回來
alg = a; // 將新指針賦給alg
return (*this);
}
func& func::operator-=(DOUBLE (*f)(DOUBLE)) // 自身減一個函數指針
{
func fn(f); // 將函數指針包裝為函數類
operator-=(fn); // 實施減操作
return (*this);
}
func func::operator-(func& fn) // 相減產生新函數
{
algo * a = new algojoin(alg, fn.alg, csub);
func f(a);
return f;
}
func func::operator-(DOUBLE a) // 與常數相減產生新函數
{
func f(*this);
f -= a;
return f;
}
func operator-(DOUBLE a, func& f) // 常數減函數
{
return (-f)+a;
}
func func::operator-(DOUBLE (*f)(DOUBLE)) // 減一個函數指針產生新函數
{
func ff(*this);
ff -= f;
return ff;
}
func operator-(DOUBLE (*f)(DOUBLE),func& fn) // 函數指針減函數
{
func ff(f);
ff -= fn;
return ff;
}
func& func::operator*=(func& fn) // 自身乘一個函數
{
algo * a = new algojoin(alg, fn.alg, cmul);
alg->refnum--; // 因為聯合算法對兩個算法都加了引用數,因此再減回來
alg = a; // 將新指針賦給alg
return (*this);
}
func& func::operator*=(DOUBLE (*f)(DOUBLE)) // 自身乘一個函數指針
{
func fn(f); // 將函數指針包裝為函數類
operator*=(fn); // 實施乘操作
return (*this);
}
func func::operator*(func& fn) // 相乘產生新函數
{
algo * a = new algojoin(alg, fn.alg, cmul);
func f(a);
return f;
}
func func::operator*(DOUBLE a) // 與常數相乘產生新函數
{
func f(*this);
f *= a;
return f;
}
func func::operator*(DOUBLE (*f)(DOUBLE)) // 乘一個函數指針產生新函數
{
func ff(*this);
ff *= f;
return ff;
}
func& func::operator/=(func& fn) // 自身除以一個函數
{
algo * a = new algojoin(alg, fn.alg, cdiv);
alg->refnum--; // 因為聯合算法對兩個算法都加了引用數,因此再減回來
alg = a; // 將新指針賦給alg
return (*this);
}
func& func::operator/=(DOUBLE (*f)(DOUBLE)) // 自身除以一個函數指針
{
func fn(f); // 將函數指針包裝為函數類
operator/=(fn); // 實施除法操作
return (*this);
}
func func::operator/(func& fn) // 相除產生新函數
{
algo * a = new algojoin(alg, fn.alg, cdiv);
func f(a);
return f;
}
func func::operator/(DOUBLE a) // 與常數相除產生新函數
{
func f(*this);
f /= a;
return f;
}
func operator/(DOUBLE a, func& f) // 常數除以函數
{
func ff(a);
return ff/f;
}
func func::operator/(DOUBLE (*f)(DOUBLE)) // 除以一個函數指針產生新函數
{
func ff(*this);
ff /= f;
return ff;
}
func operator/(DOUBLE (*f)(DOUBLE),func& fn) // 函數指針除以函數
{
func ff(f);
ff /= fn;
return ff;
}
void func::setxfactor(DOUBLE a) // 設置x因子為a
{
alg = alg->setxfactor(a);
}
void func::xroom(DOUBLE a) // x方向擴大a倍
{
alg = alg->xroom(a);
}
func& func::power(func& f) // 函數的f次乘冪,函數自身改變
{
algo * a = new algojoin(alg, f.alg, cpow);
alg->refnum--; // 因為聯合算法對兩個算法都加了引用數,因此再減回來
alg = a; // 將新指針賦給alg
return (*this);
}
func func::operator^(func& fn) // f次乘冪,產生新函數
{
algo * a = new algojoin(alg, fn.alg, cpow);
func f(a);
return f;
}
func& func::power(DOUBLE a) // 函數的a次冪,函數自身改變
{
func f(a);
return power(f);
}
func func::operator^(DOUBLE a) // 函數的a次冪,產生新函數,原函數不變
{
func f(a);
func ff(*this);
return ff.power(f);
}
func func::operator()(func & fn) // 復合函數,產生新的函數
{
algo * a = new algojoin(alg, fn.alg, ccom);
func f(a);
return f;
}
DOUBLE algopoly::calculate(DOUBLE x) // 實施函數算法
{
size_t i;
DOUBLE u;
size_t n=data.rownum-1;
u=data(n,0);
for (i=n; i>0; i--)
u=u*x+data(i-1,0);
return u;
}
algo * algopoly::clone() // 克隆自己
{
return new algopoly(*this);
}
DOUBLE algogass::calculate(DOUBLE x) // 實施函數算法
{
return gass(0,1,x);
}
algo * algogass::clone() // 克隆自己
{
return new algogass(*this);
}
func::func(DOUBLE a, DOUBLE d) // 產生正態分布函數a為均值,d為標準差
{
alg = new algogass(a,d);
}
func::func(matrix& m, funckind kind) // 構造數值相關函數,
// 如kind = polyfunc, 則m為nX1矩陣,是n-1階多項式系數,
// 其中m(0,0)為常數項,m(n-1,0)為n-1次項。
{
if(kind == polyfunc)
alg = new algopoly(m); // 產生多項式算法
else if(kind == enter2func)
alg = new algoenter2(m); // 產生一元全區間不等距插值
}
DOUBLE algoenter2::calculate(DOUBLE x) // 實施函數算法
{
size_t n = data.rownum;
size_t i,j,k,m;
double z,s;
z=0.0;
if (n<1) return(z);
if (n==1) { z=data(0,1); return z;}
if (n==2) {
z = data(0,1)*(x-data(1,0))-data(1,1)*(x-data(0,0))/
(data(0,0)-data(1,0));
return(z);
}
i=0;
while ((i<n) && (data(i,0)<x)) i++; // ((x[i]<t)&&(i<n)) i=i+1;
if (i<4) k=0;
else k=i-4;
m=i+3;
if (m>n-1) m=n-1;
for (i=k;i<=m;i++)
{ s=1.0;
for (j=k;j<=m;j++)
if (j!=i) s *= (x-data(j,0))/(data(i,0)-data(j,0)); //s=s*(t-x[j])/(x[i]-x[j]);
z=z+s*data(i,1); // y[i];
}
return(z);
}
algo * algoenter2::clone() // 克隆自己
{
return new algoenter2(*this);
}
DOUBLE algoenter::calculate(DOUBLE x) // 實施函數算法
{
// double eelgr(x0,h,n,y,t)
size_t n=data.rownum;
// double x0,h,t,y[];
size_t i,j,k,m;
DOUBLE z,s,xi,xj,p,q;
z=0.0;
if (n<1) return z;
if (n==1) { z=data(0); return(z);}
if (n==2)
{ z=(data(1)*(x-x0)-data(0)*(x-x0-h))/h;
return z;
}
if (x>x0)
{ p=(x-x0)/h; q = floor(p); i=q;
if (p>q) i++;
}
else i=0;
k=i-4;
if (i<4) k=0;
else k=i-4;
m=i+3;
if (m>n-1) m=n-1;
for (i=k;i<=m;i++)
{ s=1.0; xi=x0+i*h;
for (j=k; j<=m; j++)
if (j!=i)
{ xj=x0+j*h;
s*=(x-xj)/(xi-xj);
}
z=z+s*data(i);
}
return z;
}
algo * algoenter::clone() // 克隆自己
{
return new algoenter(*this);
}
func::func(matrix& m, DOUBLE x0, DOUBLE h) // 構造等距插值函數
// 其中m是nX1階矩陣,代表n個y值,x0是起始點,h是步長(采樣間隔)
{
alg = new algoenter(m,x0,h);
}
void func::setxshift(DOUBLE a) // 設置函數沿x軸平移a
{
alg = alg->setxshift(a);
}
void func::shiftxas(DOUBLE a) // 函數沿x軸右移a
{
alg = alg->xshiftas(a);
}
DOUBLE algo::integ(DOUBLE a, DOUBLE b, DOUBLE eps) // 在(a,b)區間積分
// 采用勒讓德高斯求積法
{
size_t m,i,j;
DOUBLE s,p,ep,h,aa,bb,w,x,g;
static DOUBLE t[5]={-0.9061798459,-0.5384693101,0.0,
0.5384693101,0.9061798459};
static DOUBLE c[5]={0.2369268851,0.4786286705,0.5688888889,
0.4786286705,0.2369268851};
m=1;
h=b-a; s=fabs(0.001*h);
p=1.0e+35; ep=eps+1.0;
while ((ep>=eps)&&(fabs(h)>s))
{ g=0.0;
for (i=1;i<=m;i++)
{ aa=a+(i-1.0)*h; bb=a+i*h;
w=0.0;
for (j=0;j<=4;j++)
{ x=((bb-aa)*t[j]+(bb+aa))/2.0;
w=w+cal(x)*c[j]; //flrgsf(x)*c[j];
}
g=g+w;
}
g *= h/2.0;
ep=fabs(g-p)/(1.0+fabs(g));
p=g; m=m+1; h=(b-a)/m;
}
return g;
}
DOUBLE func::integ(DOUBLE a, DOUBLE b, DOUBLE eps)
// 從a到b計算函數的定積分
{
return alg->integ(a,b,eps);
}
DOUBLE func::singleroot(DOUBLE x, DOUBLE eps)
// 計算函數在x附近的一個單根
{
return getroot(*alg,x,eps);
}
DOUBLE algoinverse::calculate(DOUBLE x) // 實施反函數算法
{
algo * a = al->clone(); // 克隆一個一樣的函數算法變量
a->add(-x); // 形成函數f(t)-x
DOUBLE t;
t = getroot(*a); // 求f(t)-x=0的根
delete a;
return t;
}
algo * algoinverse::clone() // 克隆自己
{
return new algoinverse(*this);
}
func func::inverse() // 產生反函數
{
algo * a = new algoinverse(alg);
func f;
f.alg = a;
return f;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -