文档视界 最新最全的文档下载
当前位置:文档视界 › 数值计算方法编程作业C语言版精编WORD版

数值计算方法编程作业C语言版精编WORD版

数值计算方法编程作业C语言版精编WORD版
数值计算方法编程作业C语言版精编WORD版

数值计算方法编程作业C语言版精编W O R D

IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】

1:第二章

(1)二分法求解非线性方程:

#include

#include

#define f(x) ((x*x-1)*x-1)

void main()

{ float a,b,x,eps;

int k=0;

printf("intput eps\n");/* 容许误差 */

scanf("%f",&eps);

printf("a,b=\n");

for(;;)

{scanf("%f, %f",&a ,&b);

if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件 */ printf("二分法不可使用,请重新输入:\n");

else break;

}

do

{ x=(a+b)/2;

k++;

if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分 */

b=x;

else if(f(a)*f(x)>0) /* 否则根在区间的右半部分 */

a=x;

else break;

}while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2; /* 取最后的小区间中点作为根的近似值 */

printf("\n The root is x=%f, k=%d\n",x,k);

}

运行结果:

intput eps

0.00001

a,b=

2,-5

The root is x=1.324721, k=20

Press any key to continue

总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。

(2)牛顿法求解非线性方程:

#include

#include

float f(float x) /* 定义函数f(x) */

{ return((-3*x+4)*x-5)*x+6; }

float f1(float x) /* 定义函数f(x)的导数 */

{ return (-9*x+8)*x-5; }

void main()

{ float eps,x0,x1=1.0;

printf("input eps:\n");

scanf("%f",&eps); /* 输入容许误差 */

do

{ x0=x1; /* 准备下一次迭代的初值 */

x1=x0-f(x0)/f1(x0); /* 牛顿迭代 */

}while(fabs(x1-x0)>eps); /*当满足精度,输出近似根*/

printf("x=%f\n",x1);

}

程序运行结果:

x=1.265328

总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。

2:第三章

(1)列主元素消去法求解线性方程:

#include

#include

#define N 20

using namespace std;

void load();

float a[N][N];

int m;

int main(){

int i,j;

int c,k,n,p,r;

float x[N],l[N][N],s,d;

cout<<"下面请输入未知数的个数m=";

cin>>m;

cout<

cout<<"请按顺序输入增广矩阵a:"<

load();

for(i=0;i

{

for(j=i;j

c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/

for(n=0;n

{s=a[i][n]; a[i][n]=a[c][n]; a[c][n]=s;} /*将列最大数防在对角线上*/ for(p=0;p

cout<

cout<

for(k=i+1;k

{

l[k][i]=a[k][i]/a[i][i];

for(r=i;r

a[k][r]=a[k][r]-l[k][i]*a[i][r];

}

}

x[m-1]=a[m-1][m]/a[m-1][m-1];

for(i=m-2;i>=0;i--)

{

d=0;

for(j=i+1;j

d=d+a[i][j]*x[j];

x[i]=(a[i][m]-d)/a[i][i]; /*求解*/ }

cout<<"该方程组的解为:"<

for(i=0;i

cout<<"x["<

//system("pause");

return 0;

}

void load()

{

int i,j;

for(i=0;i

for(j=0;j

cin>>a[i][j];

}

运行结果:

下面请输入未知数的个数m=3请按顺序输入增广矩阵a:

1 2 3 4

5 1 0 8

4 6 9 2

4 6 9 2

0 -6.5 -11.25 5.5

0 -1.86265e-008 -0.115385 3.92308

该方程组的解为:

x[0]=-9.99999 x[1]=58 x[2]=-34 Press any key to continue

总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产生较大误差,本程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进行计算。

(2)LU分解法求解线性方程:

#include

void solve(float l[][100],float u[][100],float b[],float x[],int n)

{int i,j;

float t,s1,s2;

float y[100];

for(i=1;i<=n;i++) /* 第一次回代过程开始 */

{s1=0;

for(j=1;j

{

t=-l[i][j];

s1=s1+t*y[j];

}

y[i]=(b[i]+s1)/l[i][i]; }

for(i=n;i>=1;i--) /* 第二次回代过程开始 */ {

s2=0;

for(j=n;j>i;j--)

{

t=-u[i][j];

s2=s2+t*x[j];

}

x[i]=(y[i]+s2)/u[i][i];

}

}

void main()

{float a[100][100],l[100][100],u[100][100],x[100],b[100];

int i,j,n,r,k;

float s1,s2;

for(i=1;i<=99;i++)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j<=99;j++)

{

l[i][j]=0,u[i][j]=0;

if(j==i) l[i][j]=1;

}

printf ("input n:\n");/*输入方程组的个数*/

scanf("%d",&n);

printf ("input array A:\n");/*读取原矩阵A*/

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

scanf("%f",&a[i][j]);

printf ("input array B:\n");/*读取列矩阵B*/ for(i=1;i<=n;i++)

scanf("%f",&b[i]);

for(r=1;r<=n;r++)/*求解矩阵L和U*/

{

for(i=r;i<=n;i++)

{

s1=0;

for(k=1;k<=r-1;k++)

s1=s1+l[r][k]*u[k][i];

u[r][i]=a[r][i]-s1;

}

for(i=r+1;i<=n;i++)

{s2=0;

for(k=1;k<=r-1;k++)

s2=s2+l[i][k]*u[k][r];

l[i][r]=(a[i][r]-s2)/u[r][r];

}

}

printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

printf("%7.3f ",l[i][j]);

printf("\n");

}

printf("array U:\n");/*输出矩阵U*/ for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

printf("%7.3f ",u[i][j]); printf("\n");

}

solve(l,u,b,x,n);

printf("解为:\n");

for(i=1;i<=n;i++)

printf("x%d=%f\n",i,x[i]); }

运行结果:

input n:

3

input array A:

2 2 3

4 7 7

-2 4 5

input array B:

3 1 -7

array L:

1.000 0.000 0.000

2.000 1.000 0.000 -1.000 2.000 1.000 array U:

2.000 2.000

3.000 0.000 3.000 1.000 0.000 0.000 6.000解为:

x1=2.000000

x2=-2.000000

x3=1.000000

Press any key to continue

总结:关键是把矩阵分解为L、U两个三角矩阵,回代过程比较简单。3:第四章

(1)拉格朗日差值多项式;

#include

#include

#define MAX 100

void main()

{ int i,j,k,m,n,N,mi;

float tmp,mx;

float X[MAX][MAX],Y[MAX],x[MAX],y[MAX],a[MAX];

printf("\n 输入拟合多项式的次数:\n");

scanf("%d",&m);

printf("\n 输入给定点的个数n及坐标(x,y):\n");

scanf("%d",&N);

printf("\n");

for(i=0;i

scanf("%f,%f",&x[i],&y[i]); for(i=0;i<=m;i++)

{

for(j=i;j<=m;j++)

{

tmp=0;

for(k=0;k

tmp=tmp+pow(x[k],(i+j));

X[i][j]=tmp;

X[j][i]=X[i][j];

}

}

for(i=0;i<=m;i++)

{

tmp=0;

for(k=0;k

tmp=tmp+y[k]*pow(x[k],i);

Y[i]=tmp;

}

for(j=0;j

{

for(i=j+1,mi=j,mx=fabs(X[j][j]);i<=m;i++)

if(fabs(X[i][j])>mx)

{

mi=i;

mx=fabs(X[i][j]);

}

if(j

{

tmp=Y[j];

Y[j]=Y[mi];

Y[mi]=tmp;

for(k=j;k<=m;k++)

{

tmp=X[j][k];

X[j][k]=X[mi][k];

X[mi][k]=tmp;

}

}

for(i=j+1;i<=m;i++)

{

tmp=-X[i][j]/X[j][j];

Y[i]+=Y[j]*tmp;

相关文档