版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言编程习题
第二章
习题2・2
5.用二分法编程求6x4-40x2+9=0的所有实根。
include<stdio.h>
#_nclude<math.h>
defineN10000
doubleA,B,C;
doub1ef(doublex)
|
return(A*x*x*x*x+B*x*x+C);
)
voidBM(doublea,doubleb,doubleepsl,doubleeps2)
(
inik;
doublex,xe;
doublevaluea=f(a);
doublevalueb=f(b);
if(valuea>0&&valueb>0||valuea<0&&valueb<0)return;
prinlf("Findingrootintherange:[%.31f,%.31f]\n”,a,b);
for(k=l;k<=N;k++){
x=(a+b)/2;
xe=(b-a)/2;
if(fabs(xe)<eps2)fabs(f(x)Xepsl){
printf(/zThexvalueis:%g\n',x);
printf("f(x)=%g\n\n”,f(x));
return;
)
if(f(a)*f(x)<0)b=x;
elsea=x;
)
printf(?,Noconvergence!\n*);
)
intmain()
(
doublea,b,epsl,eps2,step,start;
printf("PleaseinputA,B,C:\n*);
scanfC%lf%lf&B,&C);
printf("Pleaseinputa,b,step,epsl,eps2:\n");
scant-C%lf%lf%lf%lf%ir,&a,&b,&step,&epsl,&eps2);
for(slart=a;(start+step)<=b;start+=step){
doubleleft=start;
dcMihlpright=start+atop:
BM(left,right,epsl,eps2);
return0;
)
运行:
PleaseinputA,B,C:
6-409
Pleaseinputa,b,step,epsl,eps2:
-10101le-5le-5
Findingrootintherange:[-3.000,-2.000]
Thexvalueis:-2.53643
f(x)=-0.00124902
Findingrootintherange:[-1.000,0.000]
Thexvalueis:-0.482857
f(x)=0.00012967
Findingrootintherange:[0.000,1.000]
Thexvalueis:0.482857
f(x)=0.00012967
Findingrootintherange:[2.000,3.000]
Thexvalueis:2.53643
f(x)=-0.00124902
有时假设把判别语句
if(fabs(xe)<eps2Ifabs(f(x))<epsl)
改为
if(fabs(xe)<cps2&&fabs(f(x)Xcpsl)
会提高精度,对同一题运行结果:
Findingrootintherange:[-3.000,-2.000]
Thexvalueis:-2.53644
f(x)=-4.26496e-007
Findingrootintherange:[-1.000,0.000]
Thexvalueis:-0.482861
f(x)=-7.3797e-006
Findingrootintherange:[0.000,1.000]
Thexvalueis:0.482861
f(x)=-7.3797e-006
Findingrootintherange:[2.000,3.000]
Thexvalueis:2.53644
f(x)=-4.26496e-007
习题2・3
5.请用埃特金方法编程求出x=tgx在4.5(弧度)附近的根。
#include<stdio.h>
ttmclude<math.h>
^defineN100
ticlpfinpPT3.1415926
voidSM(doublexO,doubleeps)
(
intk;
doublex;
doublexl,x2;
for(k=l;k<=N;k++){
xl=sin(xO)/cos(xO);
x2=sin(xl)/cos(xl);
x=xO-(xl-xO)*(x1-xO)/(x2-2*x1+xO);
if(fabs(x-xO)<eps){
printf(''Thexvalueis:%g\n',x);
return;
)
xO=x;
)
printf(//Noconvegence!\n*);
1
intmainO
(
doubleops,xO;
printf("Pleaseinputeps,xO:\n");
scant'Cz%lf&eps,&x0);
SM(xO,eps);
return0;
)
运行:
Pleaseinputeps,xO:
le-54.5
Thexvalueis:4.49341
习题2.4
11.请编出用牛顿法求复根的程序,并求出
P(z)=z4-3z3+20z2+44z+54=0
接近于zo=2.5+4.5i的零点。
#include<cstdio>
#inchide<cmath>
#defineMAX_TIMES1(X)()
typedefstruct{
doublereal,image;
}COMPLEX;
COMPLEXAa[5]={{54,0},{44,0),{20,0},{-3,0},{1,0}};
returnsqrt(a.real*a.real+a.image*a.image);
)
COMPLEX((COMPLEXx)
{
in(i;
COMPLEXresult=zero;
for(i=0;i<5;i++){
result=add(result,multi(Aa[i],times(x,i)));
)
returnresult;
)
COMPLEXff(COMPLEXx){
inti;
COMPLEXresuh=zero;
for(i=0;i<4;i++){
rcsult=add(rcsult,niulti(BbliJ,timcs(x,i)));
)
returnresult;
)
intmain(){
COMPLEXzO,zl,result;
doublex,y;
intk;
printf("pleaseinputx.y\n");
scanf("%lf%lf,&x,&y);
zO.real=x;zO.image=y;
for(k=0;k<MAX_TIMES;k++){
zl=sub(ract(zO,Div(f(zO),ff(zO)));
result=f(zl);
if(distance(z(),zl)<epsl||complex_abs(result)<eps2){
printf("Therootis:z=(%.3f+%.3fi),f(z)=(%e+%ei)\n",zl.real,zl.image,result.real,
result,image);
return0;
}
zO=zI;
I
printf("Noconvergence!\n");
return0;
)
运行:
pleaseinputx,y
2.54.5
Therootis:
z=(2.471+4.64li),f(z)=(-1.122705e-007+-1.910245e-007i)
习题2・6
2.请编程用劈因子法求高次方程d+/+5/+4;v+4=0的所有复根。
#include<cstdio>
#inchide<cmath>
intmain()
{
floatb[20J,c[20];
floatdelta;
floatcps;
intprint=O;
floatfruO,frul,sO,s1,frvO,frv1;
floatdeltau,deltav;
floatu,v;
floata[20J;
intn,j;
floatrO,rl;
floatr;
inti,k;
printf("PleaseinputmaxexpC'nentAn");
scanf("%d".&n);
printf("Pleaseinputcpslion:\n");
scanf("%f',&eps);
printf("Pleaseinputthecoefficient:\n");
for(i=0;i<=n;i++)scanf("%f,",&a[i]);
for(j=0;j<=n;j++)printf(1,+%.3fXA%d",aLi],n-j);
printf("\n");
for(k=l;k<=2;k++){
u=a[n-lJ/aln-2];
v=a[n]/a[n-2];
if(k==2){
u=0;v=4;
I
while(l){
b[0]=a[0];
b[l]=all]-u*b[0];
forG=2;j<=n;j++){
bU]=aU]-u*bU-l]-v*b[j-2];
)
rO=b[n-l];
rl=b[n]+u*b[n-l];
c[0]=b[0];
c[lJ=bll]-u*b[OJ;
forG=2;j<=n-2;j++)
c[j]=b|j]-u*c[j-1]-v*c[j-2];
s0=c[n-3];
sl=c[n-2]+u*c[n-3];
fruO=u*sO-sl;
frul=v*sO;
frvO=-sO;
frv1=-s1;
deltau=-(frvI*r()-frvO*rl)/(fruO*frv1-fru1*frvO);
del(av=-(frul^rO-fruO*riyCfrvO*frul-frv1*fruO);
u=u+dcitau;
v+=deltav;
delta=u*u-4*v;
if((fabs(dcltau)<cp;s)&&(fabs(dcUav)<cps))
{
print=l;
printf("foundroots:");
r=-u/2;
i=(int)sqrl(fabs(deha))/2;
if(dclta<0){
printf("%,3f+%.3fi\t",r,fabs((double)i));
printf("%,3f-%.3fi\n",r,fabs((double)i));
)
else(
printf("%,3At\tu,r+i);
printf("%.3An",r-i);
I
if(n==l)printf("Foundrooi:%.3f\n';a[l]/a[0]);
if(k==2)return0;
)
if(k==l&&print)break;
}/*endwhile*/
}/*endfor*/
return0;
)
运行:
Pleaseinputmaxexponent:
4
Pleaseinputepslion:
le-5
Pleaseinputthecoefficient:
11544
+L000X人4+L000X人3+5.000XA2+4.000XA1+4.000XA0
习题34
5.请编程用列全主元高斯一约当消去法求矩阵A,B的逆矩阵。
#include<cstdio>
#include<cmath>
#defineMAX10
intROW;
staticfloatA[MAX+1][2*MAX+1];
voidputout()
inti,j;
printf("\nThereversematrixis:\n");
for(i=l;i<=ROW;i++)|
fbr(j=ROW+l;jv=2*ROW;j++){
printf(H%.3fH,A[i][j]);
}
printf("\n");
I
)
intget()
{
floatmax[MAX+l];
intcount_r[MAX+1];
floattmp[2*MAX+l];
floatpassI,pass2;
inti,j,k;
for(i=l;i<=ROW;i++){
max[i]=A[i][i];
count_rlij=i;
for(k=i;k<=ROW;k++){
if(max[i]<A[k][i]){
max[i]=A[k][iJ;
count_r[i]=k;
)
}/***********findthemaxone**********/
if(max[i]==0)return-1;
if(count_r[i]!=i){
fdr(k=1;k<=2*ROW;k++)
tmp[k]=A[count_i[i]][k];
A[countjr[i]][k]=A[i][k];
A[i][k]=tmp[k];
I
}/*********chantherows*************/
passl=A[i][ij;
fbr(k=l;k<=2*ROW;k++){
A[i][k]/=passl;
for(j=l;j<=ROW;j++){
if(j==i)continue;
else{
pass2=A[j][i];
for(k=l;k<=2:}ROW:k++){
AU]M=AU][k]-pass2*A[i][k];
।/************getsimple**************/
putoutO;
return0;
intmain()
{
inii,j;
floattmp=-1;
floatp;
printf("pleaseinputthenumberofROW:");
scanf("%d",&ROW);
printf("\n");
if(ROW>=MAX){
primf("ihenumberofrowistoobig!\n");
return0;
)
printf("PleaseinputthematrixA:\n");
for(i=l;i<=ROW;i++){
for(j=l;j<=ROW;j++){
scanf("%f;\&p);
A[i]|j]=p;
if(tmp<fabs(A[i][j]))tmp=fabs(A[i]|j]);
)
}
if(trnp==O){
printf("Noinverse!");
return0;
I
for(i=l;i<=ROW;i++){
AliJ[i+ROW]=l;
}
returnget();
)
运行:
pleaseinputthenumberofROW:
3
PleaseinputthematrixA:
-385
2-74
19-6
Thereversematrixis:
0.0260.3960.285
0.0680.0550.094
0.1060.1490.021
pleaseinputthenumberofROW:
4
PleaseinputthematrixA:
21-3-1
3107
-124-2
10-15
Thereversematrixis:
-0.0470.588-0.271-0.941
0.388-0.3530.4820.765
-0.2240.294-0.035-0.471
-0.035-0.0590.0470.294
习题3.2
4.编程用追赶法解以下三对角线方程组。
#include<stdio.h>
#includc<math.h>
#defineROW5
staticfloatA|ROW+1]={0,0,0,0,0.0};
sialicGoatB[ROW+1]={0,0,0,0,0.0};
staticfloatC[ROW+l]={0A0A0.0);
staticfloatX|ROW+IJ={0,0,0,0,0,0);
intmain()
(
inti;
printf("PlcascinputtheA:\n");
for(i=2;i<=ROW;i++)scanfC'%f,u,&A[i]);
printf("PleaseinputtheB:\n");
for(i=l;i<=ROW;i++)scanf("%f,",&B|iJ);
printf("PleaseinputtheC:\n");
for(i=l;i<=R0W-l;i++)scanf(”%f,”,&C[i]);
printf("PleaseinputtheF:\n");
for(i=l;i<=R0W;i++)scanf(”%f,”,&X[i]);
C[I]=C[I]/B[1];
for(i=2;i<=ROW-l;i++)
C[iJ=C[i]/(Blij-A[i]*C[i-lJ);
X[1]=X[1]/B[1];
for(i=2;i<=ROW;i++)
X[i]=(X[i]-A[i]*X[i-l])/(B[i]-A[i]*C[i-l]);
for(i=ROW-l;i>=l;i-)
X[i]=X[i]-C[i]*X[i+l];
printf("Thevalueis:\n");
for(i=l;i<=ROW;i++)printf(nx%d=%.3f^',,i,X[i]);
return0;
)
运行:
PleaseinputtheA:
-1-1-1-1
PleaseinputtheB:
44444
PleaseinputtheC:
-1-1-1-1
PleaseinputtheF:
100200200200100
Thevalueis:
xl=46.154
x2=84.615
x3=92.308
x4=84.615
x5=46.154
习题4・3
1.用高斯一赛德尔方法编程解以下线性方程组,要求当
口供+1)伏)时迭代终止。
#include<cstdio>
#include<cmath>
floatx[6];
floaty[6];
floateps;
floata[6][6]={
{4,-1,0,-1,0,0},
{-l,4,-kO,-l,O),
[0,-1,4,0,0,-1),
{-1,0,0,4,-1,0),
{0,-1,0,-1,4,-1),
{0.0,-1,0,-1,4}
};
floatb[6]={0,5,0,6.-2,6);
intgs()
inti,k,j;
floats;
for(i=0;i<6;i++)y[il=x[i]=0;
for(k=0;k<20;k++){
for(i=0;i<6;i++){
s=0;
forG=0;j<6:j++){
if(j!=i)s=s+a[i]|j]*y|j];
)
y[i]=(b[i]-s)/a[i][i];
I
for(i=0;(i<6)&&(abs(y[i]-x[i])<eps);i++);
if(i>=5)break;
for(j=0;j<6;j++)x[j]=yfj];
if(k>20){
printf("Noconvcrgcncc./n");
return-1;
I
}
returnI;
)
intmain()
{
inttag,i,m;
prinif("\mhemaxcircles:");
scanf("%d",&m);
printf("eps=");
scanf("%lf',&eps);
tag=gs();
if(tag>0){
for(i=0;i<=5;i++){
x[i]=y[i];
printf("x(%d)=%.3e\n,,,i+1,x[i]);
)
}
return0;
)
运行:
nthemaxcircles=
10
eps=
le-5
x(l)=1.000e+000
x(2)=2.000e+000
x(3)=1.000c+000
x(4)=2.000e+000
x⑸=L000e+000
x(6)=2.000e+000
习题4-4
#include<cmath>
#includc<cstdio>
intagsdl(doublea[][101,doubleb[1.intn,
doublex(],doublccps.doublc\v,intm)
(
inti,j,pcount;
doublep,t,s,q;
for(i=0;i<10;i++)x[i]=0;
p=eps+1.0;
for(pcount=0;p>=eps&&pcount<m;pcount++){
p=0.0;
for(i=0;i<n;i«»){
t=x[i];s=0.0;
for(j=0;j<n;j++)
if(j!=i)s=s+a[i]|j]*x[j];
x[i]=(b[i]-s)/a[i][i];
q=w*fabs(xfi]-t);
if(q>p)p=q;
1
)
returnpcouni;
}
intniain()
{
inti,j,n,m,count=0;
doubleeps,w[3];
staticdoublea[10][10];
staticdoublex[10],b[10];
piintf("\nthemaxcircles=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
printf("\nmatrixA:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)scanf("%lf\&a[i][j]);
printf("\nvectorb:\n");
for(i=0;i<n;i++)scanf("%lf',&b[ij);
printf("eps=");
scanf("%lf',&eps);
for(i=0;i<3;i++){
printf("w(%d)=H,i);
scanf("%If\&w[i]);
I
for(j=0;j<3;j++){
printf("w(%d)=%.3f\n',,j,w[j]);
if(agsdl(a,b,n,x,eps,wLj],in)<in){
for(i=0;i<n;i++)printf("x(%d)=%.3e”,i,x[i]);
printfC'Xn");
)
else
{
printfCfaibn1');
return0;
)
运行:
themaxcircles=
10
n=
3
matrixA:
4-10
-14-1
0-14
vectorb:
14-3
eps=
le-5
w(0)=
1.03
w(l)=
1
w(2)=
1.1
vv(0)=1.030
x(0)=5.000e-001x(l)=1.000e+000x(2)=-5.000e-001
w⑴=1.000
x(0)=5.000e-001x(l)=1.000e+000x(2)=-5.000e-001
w(2)=1.100
x(0)=5.000e-001x(l)=1.000e+000x(2)=-5.000e-001
第5章
习题5・1
2.编程求以下矛盾方程组的解:
#include<fstream.h>
#include<stdio.h>
#include<stdlib.h>
doubleeps=1.0e-5;//errorrange
double**a;//savematrixA
double**ab;//saveaugmentedmatrixAB
double**ta;//savematrixATA
double*b://savevectorsB
double*tb;//saveATB
double**ca;//savematrixA
double*cb;//savevectorsB
double*x;//saveresultvectorsX
int*fr;//rowflag
int*fc^/columnflag
intm,cm;//rownumofmatrixA
intn;//columnnumofmatrixA
intr;
voidinit();
iniG_J();
intd_O(int);
voidchange();
voidg_a_m();
voidshow();
voidshow1();
voidmain()
{iniI;
init();
t=l;
while(l)
{r=GJ();
if(m==r)break;
if(d_O(r)==O)break;
changeO;
t=0;
)
if(n==r)
{if(t)
{couivv”该线性方程组是非矛盾线性方程组,有唯一解:"vvendl;
show。;
1
else
{cout<<”该线性方程组是矛盾线性方程组,有唯一最小二乘解:"<<endl;
show。;
else
{if(t)
{coutvv”该线性方程组是非矛盾线性方程组,有普遍解:“vvendl;
show1();
)
else
{COUIV<”该线性方程组是矛盾线性方程组,有普遍最小二乘解:"<<endl;
show1();
}
)
)
voidinit()
{//open(hedatafile-ab.txt
ifstreanifin("ab.txt");
if(!fin)
{cout«"Can'topenfileab.txttoread!"«endl;
exit(-l);
I
//readtherowandcolumninformationofmatrixA
fin»m»n;
cm=m;
//requireroomofmatrixA
a=(double**)malloc((m4-l)*sizeof(double*));
inti,j;
for(i=l;i<=m;i++)
a[i]=(doublc*)malloc((r+1)*sizcof(doublc));
//readmatrixA'sdatafromab.ixi
for(i=l;i<=m;i++)
for(j=l;j<=n;j++)
fin»a[i][j];
//initmatrixB
b=(double*)malloc((m+1)*sizeof(double));
for(i=l;i<=m;i++)
fin»b[i];
//closethedatafile
fin.close();
//backupmatrixAandB
ca=a;cb=b;
return;
}
//generateaugmentedmatrix
voidg_a_m()
{inti,j;
//requireroom
ab=(double**)malloc((m+1)*sizeof(double*));
for(i=l;i<=m;i++)
ab[i]=(double*)malloc((n+2)*sizeof(double));
//loaddata
for(i=l;i<=m;i++)
{for(j=l;j<=n;j++)
ab[i][j]=a[i][j];
ab[i][n+lj=b[i];
//inittheflagarrayfr(flagrow)andfc(flagcolumn)
fr=(int*)nialloc((m+l)*sizeof(int));
fc=(int*)malloc((n+l)*sizeof(int));
for(i=l;i<=m;i++)fr[i]=i;
for(j=l;j<=n;j++)fc|j]=j;
return;
}
//Gauss-Jordoneliminationmethod
intG_J()
{intk,found,min;
inti,j,pi,pj,ft;
doubletl,t2;
//generateaugmentedmatrix
g_a_m();
k=l;min=(m<n)?m:n;
//lookformainelement
whilc(k<=min)
{(i=found=pi=pj=0;
fbr(i=k;i<=m;i++)
for(j=k;j<=n;j++)
{//t2=abs(ab[fr[i]][fc[j]]);
t2=ab[fr[i]][fc|j]];
t2=(t2>O)?t2:(-t2);
if((t2>tl)&&(t2>eps))
{found=l;tl=t2;
Pi=i;Pj=j;
)
}//endofj
//endofi
if(!found)
returnk-l;
//foundamainelement
//fixtheflagarray-exchangetherowandcolumn
ft=fr[pi];fr[pi]=fr[k];fr[k]=ft;
ft=fc[pj];fc[pj]=fc[k];fc[k]=ft;
//rowstandardize
for(j=l;j<=n+l;j++)
ab[fr[kJJU]/=tl;
//elimination
for(i=l;i<=m;i++)
{if(i==k)continue;
t2=ab[fr[i]][fc[k]];
for(j=I;j<=n+l;j++)
ab[fr[i]]rj]-=ab[fr[k]][j]*t2;
)
//lookfornextmainelement
k++;
}//endofwhile
returnk-1;
)
//a=aTa,b=aTb
voidchange()
(
//requireroomforaTa
ta=(double**)malloc((n+1)*sizeof(double*));
inti;
for(i=l;i<=n;i।i)
tali]=(double*)nialloc((n+l)*sizeof(double));
//computingaTa
intj,k;
doublesum;
for(i=l;i<=n;i++)
for(j=l;j<=n;j++)
{sum=0;
for(k=l;k<=m;k++i
sum+=a[k][i]*a[k][j];
ta[i][j]=sum;
)
//requirerooforaTb
tb=(double*)malloc((n+1)*sizeof(double));
//computingaTb
for(i=l;i<=n;i++)
{sum=0;
for(k=l;k<=m;k++)
sum+=a[k][i]*b[k];
tb[i]=sum;
)
//freea,b
//a=aTa,b=aTb
a=ta;b=tb;
m二n;
return;
}
//iffromd(r+1)tod(m)areallzero,return0
//otherwise,return1
intd_O(intr)
{
intj;
inttO;
floattl;
t0=0;
for(j=r+1;j<=m;j++)
{tl=ab[frU]][n+l];
if(t1>eps||t1<-eps)
tO=l;
)
returntO;
}
//showtheaugmentedmatrixAB
voidshow()
{inti,j;
//outputandstoretheresultX[0..n-l]
x=(doublc*)malloc(n*sizcof(doublc));
for(j=l;j<=n;j++)
fbr(i=l;i<=m;i++)
if(ab[i][j]==l)
{xU-l]=ab[i][n-l];
cout«"X["«j-l«,,]="«xU-l]«endl;
}
//outputtheresidualvectors
cout«"该方程组的剩余向量是:”<«ndl;
coui〈〈"r=(";
doublesum;
for(i=l;i<=cm;i++)
{sum=0;
for(j=l;j<=n;j++)
sum+=ca[i][j]*x[j-l];
cout«cb[i]-sum;
if(i!=cm)cout«",";
)
cout«")T"«endl;
return;
I
voidshow1()
{inti,j,k.fbund;
for(i=l;i<=r;i++)
{cout«',X[,,«fc[i]«H]="«ab[fr[i]][n+l];
for(j=l;j<=n-r;j++)
cout«,,-X["«j«,']*(,,«ab[fr[i]][fc[r+j]]«")";
cout«endl;
)
for(i=r+l:i<=n;i++)
cout«"X["«fc[i]«"J=X["«fc[i]«,']"«endl;
coutvv”是否需要特解?(y/n),;
charch;
cin»ch;
if((ch=-n')||(ch==,N'))return;
couivv"请输入参数:"v<endl;
//inputvariables
x=(double:f:)malloc((n+1)*sizeof(clouble));
for(i=r+l;i<=n;i++)
{cout«"X[M«fc[i-r]«"l=";
cin»x(i];
)
//computingspecialresult
for(i=l;i<=r;i++)
{x[fc[i]]=ab[fr[i]][n+l];
fbr(j=l;j<=n-r;j++)
x[fc[i]l-=x[rrj]*ab[fr[i]][fc[rij]];
}
//outputspecialresult
coutvv”该方程组的特解是:"«endl;
for(i=l;i<=n;i++)
cout«"X[,,«i«,,]="«x[i]«endl;
//outputtheresidualvectors
couivv”该方程组的剩余向量是:"vvendl;
cout«"r=(";
doublesum;
for(i=l;i<=cm;i++)
{sum=0;
for(j=l;j<=n;j++)
surn+=ca[ij[j]*x[j];
cout«cb[il-sum;
if(i!=cm)cout«'\";
}
cout«")T"«endl;
return;
}
运行:
ab.txt:
43
111
421
931
1641
4101826
该线性方程组是矛盾线性方程组,有唯一最小二乘解:
X[0]=0.5
X[l]=4.9
X[2]=-1.5
该方程组的剩余向量是:
r=(0.l,・0.3,0.3,-0・l)T
第六章
习题6・1
9.正弦函数表
Xk0.50.7().91.11.31.51.71.9
Sin冰0.47940.64420.78330.89120.96360.99750.99170.9463
编程用Lagrange插值多项式计算x()=0.6,0.8,1.0处的函数值sin(0.6),sin(0.8),
sin(l.O)的近似值"0.6)J(0.8)/(L0)。
#include<cstdio>
#include<cmath>
#include<cstdlib>
#defineN8
floatx[N]={0.5f,0.7f,0.9f,l.lf,1.3f,1.5f,1.7f,1.9f};
floatfTN]=(0.4794f,0.6442f,07833f,0.8912f,0.9636f,0.9975f,0.9917f,0.9463f);
floatlagrange(floatxO)
(
floats;
floatresult=0.0;
inlj,k;
for(k=0;k<N;k++){
s=1.0;
for(j=0;j<N;j++){
if(j!=k)s*=(xO-x[j])/(x[k]-x[j]);
1
result+=f[k]*s;
)
returnresult;
)
intmain(void)
(
floatxO,fO;
printf("InputthevalueofxO:");
scanf(H%r,&xO);
floatresult=lagrange(xO);
printf("xO=%.3ff(x0)=%.3fsin(x0)=%.3f\n",xO,result,sin(xO));
return0;
I
运行:
InputthevalueofxO:
x0=0.600f(x0)=0.565sin(x0)=0.565
InputthevalueofxO:
x0=0.800f(x0)=0.717sin(x0)=0.717
InputthevalueofxO:
x0=1.000f(x0)=0.841sin(x0)=0.841
习题6・5
7.某沿海货轮475水线的型值表,n=15
iXiV
11162.599.5
22950220.2355
35900589.83954
47675.8515950
588501260.2342
610881.2551900
7118802207.0194
813802.8992850
9147503124.1306
1017467.4813800
11177003853.2175
12206504390.3286
边界条件为
请编程序上机用三弯矩方程求三次样条函数第一类定解问题的解,
求xo=-9OO开始,每间隔AxulOO。,一共no=31个点上的函数值。单位毫米,当
插值点x落在[1162.5,29500]外面时,规定节点处的y值取大数10%
#include<cstdio>
#include<cmath>
#defineMAX10000000
#defineN15
doublex[]={ll62.5,2950,5900,7675.8515.8850,10881.255,11800.
13802.899,14750,17467.481,17700,20650,23600,26550,29500};
doubley[]={99.5,220.2355,589.83954,950,1260.2342,19(X),
2207.0194,2850,3124.1306,3800,3853.2175,4390.3286,4756.1508,
4976.2542,5028.7000};
intWINTH;
doubledy0=0.04770,dyn=0.(M)8810;
doubleM[N1;
doubleg[N],u[N],v[N],t[N];
doubleh[N];
voidcal(void)
inti;
for(i=0;i<N:i++)
v[O]/=t[O];
for(i=l;i<N-l;i++){
t[i]-=u[i-l]*v[i-l];
v[i]/=t[i];
>
tlN-lJ-=ulN-2J*v[N-2J;
Mro]/=t[o];
for(i=1;i<N;i++)M[i]=(M[i]-u[i-l]*M[i-l
for(i=N-2;i>=0;i-)M[i]-=v[i|*M[i+1];
)
intget_n(doubletemp)
{
inti;
if(temp<x[O]){
return0;
}elseif(temp>x[N-l]){
returnN;
}else{
for(i=l;i<N;i++)
if(temp>=x[i-1]&&temp<=x[i])
returni;
I
return0;
)
doublespline(doublek)
{
inti;
i=get_n(k);
if(i<I||i>=N)returnMAX;
else{
k=M[i-l]*(x[i]-k)*(x[i]-k)*(x[i]-k)/(6.0*h[i-l])
+M[i]*(k-x[i-1])*(k-x[i-l])*(k-x[i-1])/(6.0*h[i-1])
+(y[i-l]-M[i-l]*h[i-I]*h[i-1]/6.0)*(x[i]-k)/h[i-l]
+(y[i]-MLi]*h[i-1J*h[i-1J/6.0)*(k-x[i-1J)/h[i-1];
returnk;
)
)
voidoutput(void)
doublexO;
for(x0=-900;x()<=29500;x0+=WINTH){
printf("xO=%.21f,spline(x0)=%-16.2e\n",x0,spline(x0));
)
)
voidinain()
inti;
prinlfC'pleaseinputdeltaX:\n");
scanf("%d'\&WINTH);
for(i=0;i<N;i++)t[i]=2;
for(i=0;i<N-1;i++)h[i]=x[i+1]-x[i];
for(i=0;i<N-2;i++)u[i]=h[i]/(h[i]+h[i+1]);
u[N-2]=1.0;
for(i=l;i<N-l;i++)v[i]=l-u[i-l];
v[O]=I.O;
for(i=1;i<N-1;i++)
g[i]=6/(h[i-I]+h[i])*((y[i-H]-y[i])/h[i]
g[0]=6.0*((y[1]-y[O])/h[O]-dyO)/h[O];
g[N-1]=6.0*(dyn-(y[N-1]-y[N-2])/h[N-2])/h[N-2];
cal();
output();
运行:
pleaseinputdeltaX:
1000
x0=-900.00,spline(x0)=1.00e+007
x0=1000.00,spline(x0)=1.00e+007
x0=1100.00,spline(x0)=1.00e+007
x0=2100.00,spline(x0)=1.54e+002
x0=3100.00,spline(x0)=2.34e+002
x0=4100.00,spline(x0)=3.36e+002
x0=5100.00,spline(x0)=4.65e+002
x0=6100.00,spline(x0)=6.24e+002
x0=7100.00,spline(x0)=8.19e+002
x0=8100.00,spline(x0)=1.06e+003
x0=9100.00,spline(x0)=1.33e+003
x0=10100.00,spline(x0)=1.64e+003
x0=11100.00,spline(x0)=1.97e+003
x0=12100.00,spline(x0)=2.31e+003
x0=13100.00,spline(x0)=2.63e+003
x0=14100.00,spline(x0)=2.94e+003
x0=15100.00,spline(x0)=3.22e+003
x0=16100.()0,spline(x0)=3.48e+003
x0=17100.00,spline(x0)=3.71e+003
x0=18100.00,spline(x())=3.94e+003
xO=19IOO.OO,spline(x0)=4.14e+003
x0=20100.00,spline(x0)=4.31e+003
x0=21100.00,spline(x0)=4.46e+003
x0=22100.00,spline(x0)=4.59e+003
x0=23100.00,spline(x0)=4.70e+003
x0=24100.00,spline(x0)=4.81e+003
x0=25100.00,spline(x0)=4.89e+003
x0=26100.00,spline(x0)=4.95e+003
x0=27100.00,spline(x0)=5.00e+003
x0=28100.00,spline(x0)=5.02e+003
x0=29100.00,spline(x0)=5.03e+003
第七章
习题7・2
2.对y=sinx在[0,90],取1度为间隔,分别用库函数sin(x)和用正交多项式对
sinx做四次曲线拟合,比拟拟合的结果与库函数的计算结果,并给出拟合曲线
的系数.
#include<cstdio>
#include<cstdlib>
#include<cmath>
#defineN91
#defmeNUM1()
#define03.1415926/180
#deHneK4
doubledelta(doubles[],intns,doublex[],doubley[Lintm);
doublePoly(doublep[],intn,doublexO)
(
registerintk;
doublef;
f=p(nl;
for(k=n-l;k>=0;k-){
f=f*xO+p[k];
}
returnf;
)
voidmulpoly(doublepl"intnl,doublep2[],intn2,doublep[],int*n)
(
intij;
*n=nl+n2;
for(i=0;i<=nl+n2;i++)p[i]=();
for(i=0;i<=nl;i++){
for(j=0y<=n2y++){
p[i+j]+=pl[i]*p2UJ;
)
}
)
voidaddpoly(cloublepl[],intnl,doublecl,doublep2[JJntn2,doublec2,doublep[],int*n)
inti;
intmin;
*n=(nl>=n2)?nl:n2;
min=(nl<=n2)?nl:n2;
for(i=0;i<=min;i++){
p[i]=pl[i]*cl+p2[i]*c2;
}
for(i=min+l;i<=nl;i++){
}
for(i=min+l;i<=n2;i++){
plij=p2[i]*c2;
}
)
voidzj(doublex[],doubley[],intm)
(
doublesum^unil,resu!t[N];
doublep[NUM][NUM],temppoly[NUM],a[NUM],temppolyl[2];
intn[NUMl,ntemp,nr;
inti,k;
doublealf[NUMl,beta[NUMl,temp4empl,eps=0.00001;
n[0]=0;
p[0][0]=l;
for(sum=(),i=0;i<in;i++){
sum+=y[i];
)
a[0]=sum/m;
for(suni=0,i=0;i<m;i++){
sum+=x[i];
}
alf[l]=sum/m;
n[l]=l;
Pfl][l]=l;
p[l][O]=-alfTl];
for(sum=0,i=0;i<iTi;i++){
sum+=y[i]*(x[i]-alf[1J);
}
for(sum1=0,i=0;i<ni;i++){
suml+=(x[i]-alf[l])*(x[i]-alf[l]);
)
a[l]=sum/suml;
addpoly(pf01,n[0],a[01,p[l],n[l],a[l],result,&nr);
k=l;
do{
k++;
for(sum=0,i=0;i<m;i++){
temp=Po
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区-庆国庆-应急预案(3篇)
- 美容品营销方案(3篇)
- 茶铺特色营销方案(3篇)
- 袜子营销风险规避方案(3篇)
- 车库染色地坪施工方案(3篇)
- 钢栈桥施工方案-评审(3篇)
- 门店场景营销转化方案(3篇)
- 隧洞超前支护施工方案(3篇)
- 餐厅应急预案电梯救援(3篇)
- 鲜猪肉当地营销方案(3篇)
- T-ZZB 3233-2023 全浸没式高电压电极蒸汽锅炉
- 铁路招聘笔试试题和答案
- 2025年中国锂电池连接器数据监测报告
- 药品防灾减灾知识培训课件
- 2025福建漳州闽投华阳发电有限公司招聘52人笔试参考题库附带答案详解
- 工程变更管理培训课件
- 游泳馆预售活动方案
- 护理异位妊娠教学课件
- DB32/T 3761.27-2021新型冠状病毒肺炎疫情防控技术规范第27部分:阳性物品污染场所
- 人教A版高一数学必修第二册第六章《平面向量及其应用》单元练习题卷含答案解析
- 《计算机基础与应用(Office和WPS Office通-用)》中职全套教学课件
评论
0/150
提交评论