亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? func.cpp

?? 陳必紅 編寫的《用C++語言編寫的數學常用算法》光盤內容
?? 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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九**精品视频免费播放| 欧美日韩在线不卡| 色悠悠久久综合| 日韩一级片网站| 国产精品国产三级国产aⅴ无密码| 亚洲一区二区美女| 日韩欧美一区二区久久婷婷| 国产喂奶挤奶一区二区三区| 天天爽夜夜爽夜夜爽精品视频| 成人在线综合网站| 日韩欧美第一区| 悠悠色在线精品| 成人精品电影在线观看| 日韩欧美亚洲国产精品字幕久久久 | 亚洲精品久久久久久国产精华液| 亚洲国产成人av好男人在线观看| 成人精品免费看| 欧美精品一区二区三区四区| 亚洲一区二区三区三| 99国产精品久久久久久久久久久| 国产午夜精品一区二区三区嫩草 | 色就色 综合激情| 中文字幕精品三区| 国产在线精品国自产拍免费| 在线播放欧美女士性生活| 亚洲人被黑人高潮完整版| 国产精品12区| 久久久久久久久久久久久久久99| 日日夜夜免费精品| 欧美精品丝袜中出| 亚洲成人激情av| 欧美精品丝袜久久久中文字幕| 亚洲欧美日韩国产一区二区三区| 99精品国产视频| 亚洲女爱视频在线| 91久久精品国产91性色tv| 亚洲欧美一区二区久久| 91蝌蚪porny| 一区二区三区在线免费播放| 欧美亚洲一区三区| 亚洲午夜精品一区二区三区他趣| 在线欧美日韩精品| 香蕉久久夜色精品国产使用方法| 欧美日韩免费电影| 日本在线不卡视频| 欧美成人国产一区二区| 久久99久国产精品黄毛片色诱| 精品成人免费观看| 国产99久久久国产精品潘金| 国产精品福利电影一区二区三区四区| 成人免费av网站| 一区二区三国产精华液| 欧美高清一级片在线| 久久草av在线| 国产精品伦理在线| 欧美综合色免费| 石原莉奈在线亚洲三区| 精品国产凹凸成av人网站| 国产成人亚洲综合色影视| 亚洲日本电影在线| 欧美精品自拍偷拍| 国产成人精品影院| 亚洲精品久久久蜜桃| 91精品在线观看入口| 国产成人在线观看免费网站| 亚洲一级片在线观看| 欧美成人性战久久| 97se亚洲国产综合在线| 三级欧美在线一区| 国产精品免费人成网站| 欧美三级视频在线| 国产精品88888| 亚洲激情校园春色| 精品不卡在线视频| 欧美三电影在线| 国产精华液一区二区三区| 亚洲影视在线播放| 久久久久久一二三区| 欧美体内she精视频| 国产麻豆午夜三级精品| 五月婷婷欧美视频| 中文字幕精品在线不卡| 日韩午夜中文字幕| 色综合天天视频在线观看| 狠狠色丁香婷婷综合| 亚洲国产另类av| 国产精品国产三级国产三级人妇 | 制服.丝袜.亚洲.中文.综合| 福利电影一区二区三区| 蜜臀久久99精品久久久久久9| 亚洲欧洲一区二区三区| 精品国产一区二区三区四区四| 色视频一区二区| 成人小视频在线| 狠狠色综合日日| 免费黄网站欧美| 亚洲国产成人av| 亚洲精品第一国产综合野| 欧美国产综合一区二区| 日韩免费看的电影| 欧美久久久一区| 日本韩国一区二区三区| 99久久久精品| 成人精品鲁一区一区二区| 国产精品一区免费在线观看| 久久激情五月婷婷| 免费精品视频最新在线| 亚洲电影在线免费观看| 亚洲精品国产精品乱码不99| 亚洲人亚洲人成电影网站色| 中文字幕不卡三区| 国产区在线观看成人精品| 精品成人私密视频| 久久久综合精品| 久久婷婷成人综合色| 久久久久久亚洲综合影院红桃| 欧美精品一区二区三区在线 | 水蜜桃久久夜色精品一区的特点 | 日韩成人伦理电影在线观看| 亚洲午夜精品网| 亚洲成人第一页| 日韩精品一二三区| 日韩精品电影在线观看| 日韩高清欧美激情| 日韩电影免费在线观看网站| 欧美aⅴ一区二区三区视频| 免费精品视频在线| 黄色精品一二区| 成人激情图片网| 菠萝蜜视频在线观看一区| 91一区二区三区在线播放| 日本乱码高清不卡字幕| 91.xcao| 精品区一区二区| 欧美国产日韩a欧美在线观看 | 成人精品一区二区三区四区 | 日本道色综合久久| 欧日韩精品视频| 日韩一区二区三区电影在线观看| 精品国产污污免费网站入口| 国产人久久人人人人爽| 一区二区三区高清| 日韩不卡在线观看日韩不卡视频| 经典三级视频一区| 成人毛片老司机大片| 欧美日韩免费视频| 精品国产伦一区二区三区观看方式| 欧美国产日韩一二三区| 亚洲影视在线播放| 国产一区二区调教| 日本韩国一区二区三区| 精品乱人伦一区二区三区| 亚洲欧洲日韩女同| 日本视频免费一区| 成人av免费在线| 在线播放视频一区| 国产精品久久久久久久久久久免费看 | 国产成人aaaa| 欧美视频日韩视频在线观看| 精品国产麻豆免费人成网站| 亚洲精品va在线观看| 国产一区福利在线| 色94色欧美sute亚洲线路一久| 精品美女在线播放| 一区二区三区在线免费| 国产一区二区三区综合| 欧美日韩一卡二卡| 中日韩av电影| 美女mm1313爽爽久久久蜜臀| 99久久国产免费看| 精品久久久久久久人人人人传媒 | 久久国产婷婷国产香蕉| 91免费视频大全| 久久亚洲一区二区三区四区| 亚洲五码中文字幕| av在线播放一区二区三区| 日韩精品一区二区三区在线| 一区二区三区精品| 成人精品一区二区三区四区| 欧美一二区视频| 亚洲国产精品一区二区久久恐怖片| 国产成人亚洲综合a∨婷婷| 欧美一区二区三区在线观看| 一级做a爱片久久| 成a人片亚洲日本久久| 久久亚洲精品国产精品紫薇| 日韩高清不卡一区二区| 色欧美日韩亚洲| 亚洲视频在线观看一区| 成人激情小说乱人伦| 国产午夜精品美女毛片视频| 久久国产精品99久久久久久老狼| 欧美视频一区二| 亚洲一区二区三区在线| 99亚偷拍自图区亚洲| 中文字幕精品三区| 成人涩涩免费视频| 中文字幕成人网| 成人激情综合网站| 国产精品久久久久久久久图文区 |