计算方法程序集及例程8Word文档格式.docx
- 文档编号:17341576
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:40
- 大小:222.38KB
计算方法程序集及例程8Word文档格式.docx
《计算方法程序集及例程8Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算方法程序集及例程8Word文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
}
else
结点必须互异"
);
getch();
}
intcheckvalid(doublex[],intn)
inti,j;
for(i=0;
i<
n;
i++)
for(j=i+1;
j<
n+1;
j++)
{
if(x[i]==x[j])//若出现两个相同的结点,返回-1
{
return-1;
}
}
return1;
doubleLagrange(doublex[],doubley[],doublevarx,intn)
doublefenmu;
doublefenzi;
doubleresult=0;
printf("
Ln(x)=\n"
fenmu=1;
for(j=0;
if(i!
=j)
fenmu=fenmu*(x[i]-x[j]);
\t%f"
y[i]/fenmu);
fenzi=1;
printf("
*(x-%f)"
x[j]);
fenzi=fenzi*(varx-x[j]);
if(i!
=n)
printf("
+\n"
result+=y[i]/fenmu*fenzi;
returnresult;
}运行及结果显示:
实验二:
牛顿插值多项式
newton_cz
用牛顿插值多项式求
//newton_cz.cpp
#include<
iostream.h>
intcheckvaild(doublex[],intn)
for(i=0;
i<
n+1;
i++)
for(j=i+1;
j<
j++)
if(x[i]==x[j])
voidchashang(doublex[],doubley[],doublef[][N+1])
inti,j,t=0;
N+1;
i++)
f[i][0]=y[i];
//f[0][0]=y[0],f[1][0]=y[1];
f[2][0]=y[2];
f[3][0]=y[3];
f[4][0]=y[4]
for(j=1;
j++)//阶数j
for(i=0;
N-j+1;
i++)//差商个数i
f[i][j]=(f[i+1][j-1]-f[i][j-1])/(x[t+i+1]-x[i]);
//一阶为f[0][1]~f[3][1];
二阶为f[0][2]~f[2][2]
//三阶为f[0][3]~f[1][3];
四阶为f[0][4]
t++;
doublecompvalue(doublet[][N+1],doublex[],doublevarx)
inti,j,r=0;
doublesum=t[0][0],m[N+1]={sum,1,1,1,1};
i\tXi\tF(Xi)\t1阶\t2阶\t\t3阶\t4阶\n"
--------------------------------------------------------------------------------"
r=i;
x%d\t%f"
i,x[i]);
for(j=0;
=i;
%f"
t[r][j]);
r--;
\n"
/**/
N(x)=\n"
%f\n"
t[0][0]);
for(i=1;
i;
m[i]=m[i]*(varx-x[j]);
m[i]=t[0][i]*m[i];
sum=sum+m[i];
{printf("
+%f*"
t[0][i]);
(x-%f)"
x[j]);
returnsum;
voidmain()
doublevarx,f[N+1][N+1];
doublex[N+1]={0.4,0.55,0.8,0.9,1};
doubley[N+1]={0.41075,0.57815,0.88811,1.02652,1.17520};
checkvaild(x,N);
chashang(x,y,f);
varx=0.5;
if(checkvaild(x,N)==1)
chashang(x,y,f);
\n\n牛顿插值结果:
varx,compvalue(f,x,varx));
输入的插值节点的x值必须互异!
"
getch();
运行及结果显示:
实验三:
自适应梯形公式
autotrap
计算
的近似值,使得误差(EPS)不超过
//autotrap.cpp
math.h>
#defineEPS1e-6
doublef(doublex)
return4/(1+x*x);
doubleAutoTrap(double(*f)(double),doublea,doubleb,doubleeps)
doublet2,t1,sum=0.0;
inti,k;
t1=(b-a)*(f(a)+f(b))/2;
T(%4d)=%f\n"
1,t1);
for(k=1;
k<
11;
k++)
for(i=1;
=pow(2,k-1);
sum+=f(a+(2*i-1)*(b-a)/pow(2,k));
t2=t1/2+(b-a)*sum/pow(2,k);
(int)pow(2,k),t2);
if(fabs(t2-t1)<
EPS)
break;
else
t1=t2;
sum=0.0;
doubles;
s=AutoTrap(f,0.0,1.0,EPS);
实验四:
龙贝格算法
romberg
求
的近似值,要求误差不超过
//romberg.cpp
#defineN20
doublef(doublex){return4/(1+x*x);
doubleRomberg(doublea,doubleb,double(*f)(double),doubleeps)
doubleT[N][N],p,h;
intk=1,i,j,m=0;
T[0][0]=(b-a)/2*(f(a)+f(b));
do{
p=0;
h=(b-a)/pow(2,k-1);
p=p+f(a+(2*i-1)*h/2);
T[0][k]=T[0][k-1]/2+p*h/2;
=k;
{j=k-i;
T[i][j]=(pow(4,i)*T[i-1][j+1]-T[i-1][j])/(pow(4,i)-1);
k++;
p=fabs(T[k-1][0]-T[k-2][0]);
}while(p>
=EPS);
k--;
while(m<
=k)
{for(i=0;
=m;
T(%d,%d)=%f"
i,m-i,T[i][m-i]);
m++;
returnT[k][0];
{
\n\n积分结果= %f"
Romberg(0,1,f,EPS));
实验五:
牛顿切线法
求方程
在
,
附近的根(精度
)
//newton_qxf.cpp
#defineMaxK1000
#defineEPS0.5e-3
returnx*x*x-x-1;
doublef1(doublex)
return3*x*x-1;
intnewton(double(*f)(double),double(*f1)(double),double&
x0,doubleeps)
doublexk,xk1;
intcount=0;
k\txk\n"
-----------------------\n"
xk=x0;
%d\t%f\n"
count,xk);
do
if((*f1)(xk)==0)
return2;
xk1=xk-(*f)(xk)/(*f1)(xk);
if(fabs(xk-xk1)<
eps)
count++;
xk=xk1;
x0=xk1;
return1;
count++;
xk=xk1;
}while(count<
MaxK);
return0;
for(inti=0;
2;
doublex=0.6;
if(i==1)
x=1.5;
x0初值为%f:
x);
if(newton(f,f1,x,EPS)==1)
therootisx=%f\n\n\n"
x);
themethodisfail!
实验六:
牛顿下山法
newton_downhill
//newton_downhill.cpp
stdlib.h>
#defineEt1e-3//下山因子下界
#defineE11e-3//根的误差限
#defineE21e-3//残量精度
returnx*x*x-x-1;
return3*x*x-1;
voiderrormess(intb)
char*mess;
switch(b)
case-1:
mess="
f(x)的导数为0!
;
case-2:
下山因子已越界,下山处理失败"
default:
其他类型错误!
themethodhasfaild!
because%s"
mess);
intNewton(double(*f)(double),double(*f1)(double),double&
x0)
intk=0;
doublet;
doublefxk,fxk_temp;
ktxkf(xk)\n"
----------------------------------------------------------\n"
%-20d"
k);
%-15f"
x0);
fxk=(*f)(xk);
%-20f"
fxk);
for(k=1;
;
k++)
{
t=1;
while
(1)
%-10d"
%-10f"
t);
if((*f1)(xk)!
=0)
xk1=xk-t*(*f)(xk)/(*f1)(xk);
else
xk1);
fxk_temp=(*f)(xk1);
fxk_temp);
if(fabs(fxk_temp)>
fabs(fxk))
t=t/2;
if(t<
Et)
{
return-2;
}
下山成功\n"
break;
if(fabs(xk-xk1)<
E1)
}
intb;
doublex0;
x0=0.6;
b=Newton(f,f1,x0);
if(b==1)
\ntherootx=%f\n"
errormess(b);
实验七:
埃特金加速算法
aitken
//aitken.cpp
#defineMaxK100
doubleg(doublex)
returnx*x*x-1;
intaitken(double(*g)(double),double&
x,doubleeps)
intk;
doublexk=x,yk,zk,xk1;
kxkykzkxk+1\n"
-------------------------------------------------------------------\n"
for(k=0;
MaxK;
yk=(*g)(xk);
zk=(*g)(yk);
xk1=xk-(yk-xk)*(yk-xk)/(zk-2*yk+xk);
%-10d%-15f%-15f%-15f%-15f\n"
k,xk,yk,zk,xk1);
if(fabs(yk-xk)<
=eps)
x=xk1;
returnk+1;
return-1;
doublex=1.5;
k=aitken(g,x,EPS);
if(k==-1)
迭代次数越界!
\n经k=%d次迭代,所得方程根为:
x=%f\n"
k,x);
实验八:
正割法
附近的根(精度0.5e-8)
//ZhengGe.cpp
#defineEPS0.5e-8
intZhengGe(double(*f)(double),doublex0,double&
x1,doubleeps)
kxkf(xk)\n"
---------------------------------------------\n"
doublexk0,xk,xk1;
xk0=x0;
%-10d%-15f%-15f\n"
0,x0,(*f)(x0));
xk=x1;
for(k=1;
if((*f)(xk)-(*f)(xk0)==0)
return-1;
xk1=xk-(*f)(xk)/((*f)(xk)-(*f)(xk0))*(xk-xk0);
k,xk,(*f)(xk));
if(fabs(xk1-xk)<
%-10d%-15f%-15f\n\n"
k+1,xk1,(*f)(xk1));
---------------------------------------------\n\n"
x1=xk1;
}
xk0=xk;
return-2;
doublex0=1,x1=2;
if(ZhengGe(f,x0,x1,EPS)==1)
therootisx=%f\n"
x1);
实验九:
高斯列选主元算法
colpivot
求解方程组并计算系数矩阵行列式值
//colpivot.cpp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算方法 程序 例程