主题
最后登录1970-1-1
回帖0
精华
积分77
威望
RP
金钱 柯币
人气 ℃
注册时间2003-2-22
|
发表于 2005-6-5 01:09:18
|
显示全部楼层
回复: 会c语言的进来帮个忙~~~~
你在Google里面搜索关键字“离散的点积分”,找的第一个网页是: http://www.zjol.com.cn/vbbible/s ... l/vbNumerical16.htm 。里面介绍了两种积分的方法,而且给出了VB的源代码。当初我写程序的时候用的是辛普生公式。并将对应的VB代码改写成VC代码。现将我改写后的代码再修改一下给你看看。
void C***Doc::Simpson()
{
/*/////////////////////////////////////////////////////////////////////////
Simpson's one-third rule:
用于当有 N+1 个等间距取样的离散数据点,且 N 为偶数时,
利用以下的公式即可求出积分值。h 为取样间距。
f(x)dx=h/3*(F0+4*F1+2*F2+4*F3+2*F4+……+4*FN-1+FN)
Simpson's three-eighths rule :
用于当有 N+1 个等间距取样的离散数据点,且 N 为 3 的倍数时,
利用以下的公式即可求出积分值。h为取样间距。
f(x)dx=3*h/8*(F0+3F1+3F2+2F3+3F4+3F5+2F6+……+3FN-1+FN);
若 N 为偶数,直接使用 Simpson's one-third rule即可求出积分;
若 N 为奇数,则 1~(N+1-3) 个数据点可利用 Simpson's one-third rule,
(N+1-3 )~(N+1)个数据点可利用 Simpson's three-eighths rule,
最后再把两部分的积分值相加即可。
Dim i As Long, j As Long, u As Long, l As Long
Dim sum As Single, EvenPanel As Boolean
u = UBound(fx): l = LBound(fx)
If u - l < 2 Then MsgBox "埭汁nΤT蛹凭诼Iよi秈︽Simpson縩だ猭": Exit Function
EvenPanel = (u - l) Mod 2 = 0
sum = fx(l)
For i = 1 To (u - l - IIf(EvenPanel, 0, 3) - 1)
sum = sum + fx(i + l) * IIf(i Mod 2 = 0, 2, 4)
Next
sum = sum + fx(i + l)
For j = 1 To u - i - l + 1 - IIf(EvenPanel, 1, 0)
sum = sum + fx(j + i + l - 1) * IIf(j = 1 Or j = 4, 9, 27) / 8
Next
Simpson = sum * dx / 3
/////////////////////////////////////////////////////////////////////////*/
// double m_dDataValue[4096]; // 积分前的数据数组
// double m_dDataIntegral[4096]; // 积分后的数据数组
int i=0;
int j=0;
int k=0;
int switch0=0;
int switch1=0;
m_dDataIntegral[0]=m_dDataValue[0];
m_dDataIntegral[1]=m_dDataValue[0]*2+m_dDataValue[1];
for(i=2;i<1024;i++)
{
m_dDataIntegral=m_dDataValue[0];
switch0=(i%2)*3;
for(j=0;j<i-switch0-1;j++)
{
switch1=(2-(j%2))*2;
m_dDataIntegral+=m_dDataValue[j+1]*switch1;
}
m_dDataIntegral+=m_dDataValue[j+1];
switch0=1-(i%2);
for(k=1;k<i-j-switch0;k++)
{
if(k==1||k==4)
{
switch1=9;
}
else
{
switch1=27;
}
m_dDataIntegral+=m_dDataValue[k+j]*switch1/8;
}
m_dDataIntegral/=3;
}
}
刚出差回来,如有小问题,欢迎指正! |
|