?? integrate.cpp
字號:
// Integrate.cpp: implementation of the CIntegrate class.
//
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
//
// 求積分的類
//
/////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// 湖南城市學(xué)院 信息與計算科學(xué)系
// 黃江峰
// jiangfenghuang@msn.com
// jiangfenghuang@163.net
// 2003.4.10
//
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
//
// 特點:
// 1. 支持各種復(fù)雜的積分表達式,可含任何數(shù)學(xué)函數(shù),
// 如 3*exp(x)*tan(x)/(8+log(x))
// 2. 可檢查出表達式的書寫錯誤
// 3. 可設(shè)置積分精度
// 4. 使用方便簡單
//
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
// 使用方法
// 1. 定義個CIntegrate 對象,構(gòu)造時初始化或用
// initial(char *s,double Upperlimit,double LowerLimit)]
// 函數(shù)初始化
// 2.調(diào)用SetError(double Error)設(shè)置誤差
// 3.調(diào)用integrate(void)進行積分,若返回值為1,則調(diào)用
// getvalue(void)取得積分結(jié)果,否則積分結(jié)果有錯,應(yīng)舍棄
//
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
//
// 支持的函數(shù)的編號及功能
//
// 編號 函數(shù) 功能 調(diào)用的math.h庫函數(shù) 備注
//
// 1 abs(x) 取絕對值|x| fabs(x)
// 2 acos(x) 反余弦函數(shù) acos(x) -1<=x<=1
// 3 asin(x) 反正弦函數(shù) asin(x) -1<=x<=1
// 4 atan(x) 反正切函數(shù) atan(x)
// 5 acot(x) 反余切函數(shù) PI/2-atan(x)
// 6 cos(x) 余弦函數(shù) cos(x)
// 7 cosh(x) 雙曲余弦函數(shù) cosh(x)
// 8 cot(x) 余切函數(shù) 1/tan(x) tan(x)!=0
// 9 exp(x) e的x次方 exp(x)
// 10 floor(x) ⊥x⊥ floor(x) 求不大于x的最大整數(shù)
// 11 mod(x,y) x%y mod(x,y) y!=0
// 12 ln(x) 取自然對數(shù) log(x) x>0
// 13 log(x) 取10的對數(shù) log10(x) x>0
// 14 pow(x,y) x的y次方 pow(x,y)
// 15 sin(x) 正弦函數(shù) sin(x)
// 16 sinh(x) 雙曲正弦函數(shù) sinh(x)
// 17 sqrt(x) 對x開方 sqrt(x) x>=0
// 18 tan(x) 正切函數(shù) tan(x)
// 19 tanh(x) 雙曲正切函數(shù) tanh(x)
//
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "jifen.h"
#include "Integrate.h"
#include "string.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIntegrate::CIntegrate() //構(gòu)造函數(shù),設(shè)定誤差初始值為0.0001
{
Error=0.0001; //誤差初始值為0.0001
}
CIntegrate::~CIntegrate()
{
}
//構(gòu)造函數(shù),將字符串str賦給存放
//達式的字符串mathStr
//設(shè)定誤差初始值為0.0001
CIntegrate::CIntegrate(char *str)
{
Error=0.0001; //設(shè)定誤差初始值為0.0001
strcpy(mathStr,str);
}
//構(gòu)造函數(shù),將字符串str賦給存放算術(shù)表
//達式的字符串mathStr,uplimit和lowlimit
//分別賦給上限UpperLimit和下限LowerLimit
//設(shè)定誤差初始值為0.0001
CIntegrate::CIntegrate(char *str,double uplimit,double lowlimit)
{
Error=0.0001;
strcpy(mathStr,str);
UpperLimit=uplimit;
LowerLimit=lowlimit;
}
//初始化函數(shù),將字符串str賦給存放算術(shù)表
//達式的字符串mathStr,uplimit和lowlimit
//分別賦給上限UpperLimit和下限LowerLimit
int CIntegrate::initial(char *str,double uplimit,double lowlimit)
{
strcpy(mathStr,str);
UpperLimit=uplimit;
LowerLimit=lowlimit;
return 1;
}
void CIntegrate::setError(double error) //設(shè)定誤差
{
Error=error;
}
//積分函數(shù),
//檢查表達式是否正確
//調(diào)用龍貝格積分函數(shù)RombergIntgrt()
//若表達式和積分正確,返回1,否則返回0
int CIntegrate::integrate(void)
{
IntgrtStr.Initial(mathStr);
//初始化對象IntgrtStr
//將算術(shù)表達式mathStr賦給string
if(!IntgrtStr.checkString())
return 0; //檢查表達式是否正確,正確則繼續(xù),否則返回0
if(RombergIntgrt()) // 積分正確,返回1
return 1;
else return 0; //否則返回0
}
//龍貝格積分函數(shù)
//根據(jù)積分上限、下限、函數(shù)表達式和要求的最誤差,用龍貝格算法
//求積分。如果積分正確,將結(jié)果賦給result。并返回1,否則返回0
int CIntegrate::RombergIntgrt()
{
double h, //步長
t1,t2,sum, //梯形公式的中間值
s1,s2=0.0, //Sinpson公式的中間值
c1,c2=0.0, //Cotes公式的中間值
r1,r2=0.0, //Romberg公式中間值
k,x, //加工次數(shù)、變量x
a,b; //上限、下限
flag=1; //標(biāo)識積分過程中的f(X)Y運算有無錯
//的初始值為1
a=LowerLimit;
b=UpperLimit;
h=b-a;
t1=h*(f(a)+f(b))/2;
k=1;
while(1) //當(dāng)誤差大于給定誤差
{
//梯形公式
sum=0;
x=a+h/2;
while(x<b)
{
sum=sum+f(x);
x=x+h;
}
t2=t1/2+h*sum/2;
//Simpson公式
s2=t2+(t2-t1)/3;
if(k==1)
{
k++;
h=h/2;
t1=t2;
s1=s2;
continue;
}
//Cotes公式
c2=s2+(s2-s1)/15;
if(k==2)
{
c1=c2;
k++;
h=h/2;
t1=t2;
s1=s2;
continue;
}
//Romberg公式
r2=c2+(c2-c1)/63;
if(k==3)
{
r1=r2;
c1=c2;
k++;
h=h/2;
t1=t2;
s1=s2;
continue;
}
if(fabs(r2-r1)<Error || !flag) //如果滿足誤差或f(x)出錯
break; //則退出
else //否則改變條件,繼續(xù)
{
r1=r2;
c1=c2;
k++;
h=h/2;
t1=t2;
s1=s2;
continue;
}
}//while(1)
//運算中無錯誤,則繼續(xù)
if(flag) //積分過程中無錯誤,則將結(jié)果賦給result,返回1
{
result=r2;
return 1;
}
else //否則返回0
return 0;
}
//表達式的求值函數(shù)
//返回值為將x代入表達式的值
//若計算中出現(xiàn)錯誤,則將標(biāo)識符flag賦0
double CIntegrate::f(double x)
{
IntgrtStr.setX(x); //將變量x賦給IntgrtStr中的x
IntgrtStr.stringToBolan(); //將表達式轉(zhuǎn)換成波蘭式
if(!IntgrtStr.compvalue()) //compvalue()返回值為0時表示
//計算正確
return(IntgrtStr.getvalue());
else
{
flag=0;
return 0;
}
}
double CIntegrate::getvalue(void) //返回積分結(jié)果result的值
{
return result;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -