计算方法报告
- 格式:doc
- 大小:651.00 KB
- 文档页数:19
}
}
运行结果为:
所以原方程组的近似解为:x1=8.705758, x2=7.823033, x3=7.586371, x4=7.522452, x5=7.503439, x6=7.491305, x7=7.461785, x8=7.355835, x9=6.961556, x10=5.490389
0,0,0,0,0,0,0,0,1,-4,-15};
void Direct(float*,int,float[]);
Direct(a[0],10,x);
for(i=0;i<=9;i++)printf("x[%d]=%f\n",i,x[i]);
}
void Direct(float*u,int n,float x[])
float Lagrange(float x[],float y[],float xx,int n)
{
int i,j;
float *a,yy=0;
a=new float[n];
for(i=0;i<n;i++)
{
a[i]=y[i];
for(j=0;j<n;j++)
{
if(j!=i)
{
a[i]*=(xx-x[j])/(x[i]-x[j]);
N=30000时,运行结果:
②用从大到小顺序的C语言算法分别计算 ,结果如下:
N=1000时,运行结果:
N=10000时,运行结果:
N=30000时,运行结果:
实习题2
1.用牛顿法法解下列方程的根:
3) 。
解:
#include <cmath>
using namespace std;
#define N 100
yy=Lagrange(x,y,xx1,6);
printf("x1=%f,y1=%f\n",xx1,yy);
yy=Lagrange(x,y,xx2,6);
printf("x2=%f,y2=%f\n",xx2,yy);
yy=Lagrange(x,y,xx3,6);
printf("x3=%f,y3=%f\n",xx3,yy);
while(1)
{
eps=0;
for(i=0;i<=n-1;i++)
{
d=0;
for(j=0;j<=n-1;j++)
{
if(j==i)continue;
d+=*(a+i*(n+1)+j)*x[j];
}
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
eps+=fabs(dx-x[i]);
#include<math.h>
#define N 500
void main()
{
int i;
float x[4];
float c[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};
void GauseSeidel(float *,int,float[]);
*(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r));
*(u+i*(n+1)+r)/=*(u+r*(n+1)+r);
}
}
for(i=n-1;i>=0;i--)
{
for(r=n-1;r>=i+1;r--)
*(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r];
#define eps 1e-6
#define eta 1e-8
float Newton(float(*f)(float),float(*f1)(float),float x0)
{
float x1,d;
int k=0;
do
{
x1=x0-(*f)(x0)/(*f1)(x0);
if(k++>N||fabs((*f1)(x1))<eps)
{
int i;
float a[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};
float x[4];
Jacobi(a[0],4,x);
for(i=0;i<4;i++)printf("x[%d]=%f\n",i,x[i]);
}
Ⅲ、运行结果如下:
}
执行后结果为:
N=2时,运行结果为:
N=3时,运行结果为:
N=100时,运行结果为:
N=4000时,运行结果为:
结论:通过比较可知:N的值较小时两种算法的运算结果相差不大,但随着N的逐渐增大,两种算法的运行结果相差越来越大。
3)①用从小到大的C语言算法计算 ,结果如下:
N=1000时,运行结果:
N=10000时,运行结果:
{
printf("\n Newton迭代发散");
break;
}
d=fabs(x1)<1?x1-x0:(x1-x0)/x1;
x0=x1;
printf("x(%d)=%f\t",k,x0);
}
while(fabs(d)>eps&&fabs((*f)(x1))>eta);
return x1;
}
float A(float x){
0,0,1,-4,1,0,0,0,0,0,-15,
0,0,0,1,-4,1,0,0,0,0,-15,
0,0,0,0,1,-4,1,0,0,0,-15,
0,0,0,0,0,1,-4,1,0,0,-15,
0,0,0,0,0,0,1,-4,1,0,-15,
0,0,0,0,0,0,0,1,-4,1,-15,
回代过程为
C语言程序为:
#include<stdio.h>
void main()
{
float x[10];
int i;
float a[10][11]={-4, 1,0,0,0,0,0,0,0,0,-27,
1,-4,1,0,0,0,0,0,0,0,-15,
0,1,-4,1,0,0,0,0,0,0,-15,
《计算方法与实习》
实验报告
姓名:学号:
专业:实验室:金智楼
评定成绩:审阅教师:
实习题1
4.设 ,已知其精确值为 。
1)编制按从大到小的顺序计算 的程序;
2)编制按从小到大的顺序计算 的程序;
3)按2种顺序分别计算 ,并指出有效位数。
解:1)从大到小的C语言算法如下:
#include<stdio.h>
实习题4
2、按下列数据
xi
0.30
0.42
0.50
0.58
0.66
0.72
yi
1.04403
1.08462
1.1Байду номын сангаас803
1.15603
1.19817
1.23223
作五次插值,并求x1=0.46, x2=0.55, x3=0.60时函数的近似值。
解:Ⅰ、输入 令
Ⅱ、对 ,计算
C语言程序为:
#include<stdio.h>
using namespace std;
void main()
{
float n=0.0;
int i;
int N;
cout<<"Please input N"<<endl;
cin>>N;
for(i=2;i<=N;i++)
{
n=n+1.0/(i*i-1);
}
printf("%-100f",n);
printf("\n");
x[i]=dx;
}
if(eps<1e-6)
{
printf("迭代次数为:%d\n",k);return;
}
if(k>N)
{
printf("迭代发散\n");
return;
}
k++;
}
}
Ⅲ、运行结果如下:
分析:用雅可比迭代法和高斯-赛德尔迭代法解该方程组时,当二者精度相同时,高斯-赛德尔迭代法的迭代次数比雅可比迭代法的迭代次数要少8次,大大减少了计算量。
N=N-1;
}
printf("%-100f",n);
printf("\n");
}
执行后结果为:
N=2时,运行结果为:
N=3时,运行结果为:
N=100时,运行结果为:
N=4000时,运行结果为:
2)从小到大的C语言算法如下:
#include<stdio.h>
#include<math.h>
#include<iostream>
Ⅱ、程序代码如下: