数值分析编程题c语言汇总Word下载.docx
- 文档编号:22456905
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:57.91KB
数值分析编程题c语言汇总Word下载.docx
《数值分析编程题c语言汇总Word下载.docx》由会员分享,可在线阅读,更多相关《数值分析编程题c语言汇总Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
x[9]=u1[9]
三、1.计算程序:
#include"
math.h"
stdio.h"
#definege8
voidmain()
{
intsign(doublex);
doublea[][9]=
{12.38412,2.115237,-1.061074,1.112336,-0.113584,0.718719,1.742382,3.067813,-2.031743},
{2.115237,19.141823,-3.125432,-1.012345,2.189736,1.563849,-0.784165,1.112348,3.123124},
{-1.061074,-3.125432,15.567914,3.123848,2.031454,1.836742,-1.056781,0.336993,-1.010103},
{1.112336,-1.012345,3.123848,27.108437,4.101011,-3.741856,2.101023,-0.71828,-0.037585},
{-0.113584,2.189736,2.031454,4.101011,19.897918,0.431637,-3.111223,2.121314,1.784317},
{0.718719,1.563849,1.836742,-3.741856,0.431637,9.789365,-0.103458,-1.103456,0.238417},
{1.742382,-0.784165,-1.056781,2.101023,-3.111223,-0.103458,14.713846,3.123789,-2.213474},
{3.067813,1.112348,0.336993,-0.71828,2.121314,-1.103456,3.123789,30.719334,4.446782},
{-2.031743,3.123124,-1.010103,-0.037585,1.784317,0.238417,-2.213474,4.446782,40.00001}
};
doublek,h,s,w;
inti,j,n,m,g;
doubleu[9],x1[9],y[9],q[9],b1[9][10],x[9];
doubleb[9]=
{2.1874369,33.992318,-25.173417,0.84671695,1.784317,-86.612343,1.1101230,4.719345,-5.6784392};
for(j=0;
j<
7;
++j)/*Household变换*/
{
s=0.0;
for(i=j+1;
i<
9;
++i)
s=s+a[i][j]*a[i][j];
s=sqrt(s);
h=(a[j+1][j]>
0)?
(s*s+s*a[j+1][j]):
(s*s-s*a[j+1][j]);
for(g=0;
g<
++g)
{
if(g<
=j)
u[g]=0;
elseif(g==j+1)
u[g]=a[j+1][j]+s*sign(a[j+1][j]);
elseu[g]=a[g][j];
}
for(m=0;
m<
++m)
y[m]=0;
for(n=0;
n<
++n)
y[m]=y[m]+a[m][n]*u[n];
y[m]=y[m]/h;
k=0;
for(i=0;
k=k+u[i]*y[i];
k=0.5*k/h;
q[i]=y[i]-k*u[i];
for(n=0;
for(m=0;
a[m][n]=a[m][n]-(q[m]*u[n]+u[m]*q[n]);
}
printf("
Household:
\n"
);
for(i=0;
for(j=0;
++j)
if(j%9==0)
printf("
printf("
%-9.5f"
a[i][j]);
printf("
w=1.4;
/*超松弛法*/
i++)
x1[i]=0;
for(j=0;
j++)
{
if(i==j)
b1[i][j]=0;
elseb1[i][j]=-a[i][j]/a[i][i];
}
for(i=0;
b1[i][9]=b[i]/a[i][i];
n++)
for(i=0;
{
s=0;
for(j=0;
s=s+b1[i][j]*x1[j];
s=s+b1[i][9];
x1[i]=x1[i]*(1-w)+w*s;
}
{
if(i==5)
printf("
printf("
x%d=%-10.6f"
i,x1[i]);
}
u[0]=a[0][0];
/*以下是消去法*/
y[0]=b[0];
for(i=1;
q[i]=a[i][i-1]/u[i-1];
u[i]=a[i][i]-q[i]*a[i-1][i];
y[i]=b[i]-q[i]*y[i-1];
x[ge]=y[ge]/u[ge];
for(i=ge-1;
i>
=0;
i--)
x[i]=(y[i]-a[i][i+1]*x[i+1])/u[i];
x%d=%-10.6f"
i,x[i]);
}
intsign(doublex)
intz;
z=(x>
=(1e-6)?
1:
-1);
return(z);
2.打印结果:
12.38412-4.893080.000000.000000.000000.000000.000000.000000.00000
-4.8930825.398426.494100.000000.000000.000000.000000.000000.00000
0.000006.4941020.611508.243930.000000.000000.000000.000000.00000
0.000000.000008.2439323.42284-13.880070.000000.000000.00000-0.00000
0.000000.000000.00000-13.8800729.698284.534500.000000.000000.00000
0.000000.000000.000000.000004.5345016.006124.881440.000000.00000
0.000000.000000.000000.000000.000004.8814426.01332-4.50363-0.00000
0.000000.000000.000000.000000.000000.00000-4.5036321.254064.50450
0.000000.000000.00000-0.000000.000000.00000-0.000004.5045014.53412
x0=1.073409x1=2.272579x2=-2.856601
x3=2.292514x4=2.112165x5=-6.422586
x6=1.357802x7=0.634259x8=-0.587042
x0=1.075799x1=2.275744x2=-2.855515
x3=2.293099x4=2.112634x5=-6.423838
x6=1.357923x7=0.634244x8=-0.587266
四、问题讨论:
此程序具有很好的通用性。
在GS方法的基础上,已经求出x的第m解,第m-1基础上,经过重新组合得新的序列,而在此新序列收敛速度加快。
上机实习题二
已知函数值如下表:
x
1
2
3
4
5
f(x)
0.6931478
1.0986123
1.3862944
1.6094378
6
7
8
9
10
1.791795
1.9459101
2.079445
2.1972246
2.3025851
f’(x)
f’
(1)=1
f’(0)=0.1
试用三次样条插值求f(4.563)及f′(4.563)的近似值。
二、解题方法的理论依据:
任意划分的三弯矩插值法以及方程组解法中的三对角阵追赶算法。
应用三次样条插值法能够对函数产生很好的逼近效果。
而追赶算法又具有计算量少、方法简单、算法稳定的特点。
方法应用条件:
适用于求复杂函数在给定区间内某一点的函数值,给出函数f(x)在区间[a,b]中的n个插值点,并且给出函数在区间端点处的值。
#definen11
#definege11
inti,m;
doublee,s,E,q[12],u[12],y[12],c[12],w[12];
doubleb[12]={2,0,4.15888308,6.5916738,8.3177664,9.6566268,10.750557,11.6754606,
12.47667,13.1833476,13.8155106,14.0155106};
doublea[12][12]={{-2,-4},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}};
a[n][n-1]=4;
a[n][n]=2;
for(i=1;
11;
a[i][i-1]=1;
a[i][i]=4;
a[i][i+1]=1;
u[0]=a[0][0];
/*消去法求c[i]*/
y[0]=b[0];
12;
q[i]=a[i][i-1]/u[i-1];
u[i]=a[i][i]-q[i]*a[i-1][i];
y[i]=b[i]-q[i]*y[i-1];
c[ge]=y[ge]/u[ge];
for(i=ge-1;
c[i]=(y[i]-a[i][i+1]*c[i+1])/u[i];
请输入要插的值:
"
scanf("
%lf"
&
E);
{
e=fabs(E-i);
if(e>
=2)
w[i]=0;
elseif(e<
=1)
w[i]=0.5*fabs(e*e*e)-e*e+2.0/3.0;
else
w[i]=(-1.0/6.0)*fabs(e*e*e)+e*e-2*fabs(e)+4.0/3.0;
}
s=0.0;
s=s+c[i]*w[i];
f(%lf)=%lf"
E,s);
请输入要求的导数的值:
%d"
m);
f’(%d)=%lf\n"
m,(c[m+1]-c[m-1])/2.0);
输出结果:
4.563
f(4.563)=1.517932
f’(4.563)=0.249350
在给均匀分划的插值函数x赋值时,由于使用for循环,误将x[i]=i+1写成x[i]=i,导致运算错误。
此程序具有一定通用性,对于任意划分的三弯矩插值法,只许改动x[i]即可。
求解方程组Mj时,要用到三对角方程组的追赶法(也称Thomas算法)。
变量较多,应注意区分。
求导时注意正负号。
上机实习题三
用Newton法求方程
X7-28x4+14=0
在(0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001)。
二、解题方法及理论依据:
Newton迭代法是平方收敛于方程f(x)=0在区间[a,b]上的唯一解α,收敛速度较快,循环次数少。
ⅰ)f(a)f(b)<
ⅱ)f”(x)在区间[a,b]上不变号.
ⅲ)f’(x)≠0
ⅳ)|f(c)|/b-a≤|f’(c)|其中c是a,b中使min[|f’(a),f’(b)]达到的一个,则对任意时近似值x0€[a,b],Newton迭代过程为
xk+1=φ(xk)=x-f(xk)/f’(xk),k=1,2,3…
算法:
令
故以1.9为起点
main()
floatx,y,f,f1;
%f"
x);
do{
y=x;
f=pow(y,7)-28*pow(y,4)+14;
/*定义f(x)的表达式*/
f1=7*pow(y,6)-112*pow(y,3);
/*定义f’(x)的表达式*/
x=y-f/f1;
/*Newton迭代法*/
while(fabs(x-y)>
=1e-5);
/*控制误差小于0.00001*/
\nTheresultofthequestionis%f\n"
x);
请输入端点值:
1.90.1
x=0.8454973.030577
程序较为简单。
它的几何意义为xk+1是f(x)在点xk的切线与x轴交点,故也称为切线法,它是平方收敛的,此处取xk=1.9收敛性较好,要注意判断f′(xk)是否为零。
上机实习题四
用Romberg算法求
(允许误差ε=0.00001)。
龙贝格(Romberg)方法求数值积分
T1(0)=(b-a)/2*[f(a)+f(b)]
T1(l)=(1/2)*{T1(l-1)+(b-a)/2l-1*∑f[a+(2i-1)*(b-a)/2l]}
Tm+1k-1=[4mTm(k)-Tm(k-1)]/(4m-1)
inta=1,b=3;
doublef(doublex)/*求f(x)=3xx1.4(5x+7)sinx2的值*/
doublez;
z=pow(3,x)*pow(x,1.4)*(5*x+7)*sin(x*x);
return(z);
doubles(intl)/*求T1(l)中的(b-a)/2l-1*∑f[a+(2i-1)*(b-a)/2l]*/
externa,b;
doublez=0.0;
m=pow(2,l-1);
=m;
i++)z+=f(a+1.0*(2*i-1)/m);
z*=1.0*(b-a)/m;
{externa,b;
doubleT[20][20];
intm,n,l=0;
T[1][0]=(b-a)/2.0*(f(a)+f(b));
do/*龙贝格(Romberg)算法*/
{l++;
T[1][l]=0.5*(T[1][l-1]+s(l));
n=l-1;
for(m=2;
n>
m++,n--)/*求解Tl(0)*/
T[m][n]=(pow(4,m-1)*T[m-1][n+1]-T[m-1][n])/(pow(4,m-1)-1.0);
while(fabs(T[l][0]-T[l-1][0])>
\nT[%d][0]=%f"
l,T[l][0]);
T[8][0]=440.536017
此程序较繁,计算T1(k)需要复化梯形公式,还要用到Richardson外推法,构造新序列,计算新分点的值时,这些数值个数成倍增加。
应用给出所要求的误差ε,当|Tl(0)-Tl+1(0)|<
ε时控制循环。
程序具有广泛的通用性。
上机实习题五
用定步长四阶Runge-Kutta法求解
dy1/dt=1
dy2/dt=y3
dy3/dt=1000-1000y2-100y3
y1(0)=0
y2(0)=0
y3(0)=0
h=0.0005,打印yi(0.025),yi(0.045),yi(0.085),yi(0.1),(i=1,2,3)
高阶方程组的Runge-Kutta解法
Yn+1=Yn+(1/6)*(K1+2K2+2K3+K4)
K1=h*F(xn,Yn)
K2=h*F(xn+h/2,Yn+K1/2)
K3=h*F(xn+h/2,Yn+K2/2)
K4=h*F(xn+h,Yn+K3)
适用条件:
使用于那些用普通的积分方法解不了的微分方程组.只要知道函数之间的关系和初值就可以不用解出表达式而直接求解函数在要求点的值。
#include<
stdio.h>
doublet,h=0.0005,y1=0,y2=0,y3=0,ky1[5],ky2[5],ky3[5];
for(t=h;
t<
=0.1001;
t+=h)/*Runge-Kutta算法具体过程*/
{ky1[1]=h*1;
ky2[1]=h*y3;
ky3[1]=h*(1000-1000*y2-100*y3);
ky1[2]=h*1;
ky2[2]=h*(y3+ky3[1]/2);
ky3[2]=h*(1000-1000*(y2+ky2[1]/2)-100*(y3+ky3[1]/2));
ky1[3]=h*1;
ky2[3]=h*(y3+ky3[2]/2);
ky3[3]=h*(1000-1000*(y2+ky2[2]/2)-100*(y3+ky3[2]/2));
ky1[4]=h*1;
ky2[4]=h*(y3+ky3[3]);
ky3[4]=h*(1000-1000*(y2+ky2[3])-100*(y3+ky3[3]));
y1+=(ky1[1]+2*ky1[2]+2*ky1[3]+ky1[4])/6;
y2+=(ky2[1]+2*ky2[2]+2*ky2[3]+ky2[4])/6;
y3+=(ky3[1]+2*ky3[2]+2*ky3[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 编程 语言 汇总
![提示](https://static.bdocx.com/images/bang_tan.gif)