资源描述
实验报告计算方法(小肥)
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
实验一、用一般迭代法计算方程x³ -x² -1= 0在x0=1.5附近近似根,准确到10‾ ³。
1。实验目的:掌握非线性方程一般迭代算法。
2.实验内容和要求:编写求近似根的程序,并上机调试和运行.观察运行结果、所需的迭代次数和迭代结果,记录每次程序的输入输出数据。
3.算法描述:画出算法框图。
转换方程,写出迭代公式x0=1.5, e=0.001,M=100
Y
Xk+1=j(xk) k=1,2…..M
输入X0=1.5,e=0.001,M=100
N
|Xk+1-Xk|<ee
输出k,x并终止计算
Xk=Xk+1
输出迭代失效信息,并终止计算
4程序运行结果
5结果评论
结果运行正确,基本完成了题目给出的方程计算,但过程简单,程序没有体现方程的一般性,仅使用于此方程的计算,
6实验评论
运用一般迭代法,写出迭代公式,根据给出的初值及一般迭代法算法,分别计算x1,x2…。xk,若|x1-x0|在精度范围内,则停止计算。
7源程序
#include<iostream〉
#include<math。h>
using namespace std;
double f(double); //申明函数
int main()
{
double a,i=0,a1,pr;
cout〈<”输入初值a:\n";
cin〉>a;
cout<<"输入精度:\n";
cin>>pr;
do
{
a1=a;
a=f(a);
i++;
if(i〉1000000)
{cout<<"错误,超过迭代次数!";return 0;}
}
while((a—a1)〉pr||(a—a1)〈-pr);
cout<〈"迭代次数为 "<〈i〈〈endl;
cout<<”结果为 ”<<a〈<endl;
}
double f(double x) //定义函数
{
return pow((x+1.0),(1。0/3));
}
实验二、用列主元高斯消元法求解线性方程组.
1。实验目的:程序实现高斯列主元消去法。
2。实验内容和要求:编写用列主元高斯消元法求解方程组的程序,并上机调试和运行。反复尝试,观察程序的输出解,记录每次程序的输入输出数据。
3 算法描述
3.1 第1步消元:在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化形式:
3.2 第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化形式:
3。3 第3步消元-—在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化形式:
3.4回代求解出方程组的解.
4 程序运行结果
程序中输入方程元素,再根据要求输入系数矩阵。
在第一列中选主元,并将主元所在行与第一行交换,行列式变换,消元。逐步进行。
5 结果评论
此计算结果正确,过程步骤描述清晰,先输入系数矩阵,右边向量,选取了第一列的主元,再消元,完成后选取第二列的主元,再交换顺序消元,形成上三角形,用回代发计算结果。此程序基本完成了列主元解方程组的要求.
6 实验结论
我很少使用计算机语言来解方程组,但是用了这个方法之后,才发现数学跟计算机真的是一体的,好多数学问题都可以用程序来描述,然后计算,此高斯列主元消去法便是一个实例,即让我加深了对高斯主元消去法的理解,也让我进一步加深了对计算机语言的了解,在很大程度上提升了语言知识,以后考虑数学问题时都可以想一下怎么用程序解决了,这样也让计算速度提高好多倍.
7 源程序清单
#include <stdio.h>
#include<math。h>
int n;
float a[100][100],b[100];
void output ()
{int i,j;
printf(”矩阵a,b是:\n");
for (i=0;i〈n;i++)
{ for (j=0;j<n;j++)
printf("%—10f",a[i][j]);
printf("%—10f",b[i]);
printf("\n");
}
}
void input()
{
int i,j;
printf("请输入矩阵阶数: ");
scanf("%d”,&n);
printf(”请输入系数矩阵(a):\n");
for(i=0;i〈n;i++)
for(j=0;j〈n;j++)
{scanf("%f”,&a[i][j]);}
printf("请输入右边数据(b):\n”);
for(i=0;i〈n;i++)
scanf(”%f”,&b[i]);
}
void gaosi ()
{ int k,i,j,max;
float ta,tb,m;
for(k=0;k<n;k++)
{max=k;
for(i=k+1;i〈n;i++)
{if(fabs(a[i][k])〉fabs(a[max][k]))
max=i;
}
if(i!=k)
{for(j=0;j〈n;j++)
{ta=a[k][j];a[k][j]=a[max][j];a[max][j]=ta;}
tb=b[k];b[k]=b[max];b[max]=tb;
}output();
for(i=k+1;i〈n;i++)
{m=a[i][k]/a[k][k];
for(j=k;j<n;j++)
a[i][j]=a[i][j]—a[k][j]*m;
b[i]=b[i]-m*b[k];
output();
}
}
}
void qiujie ()
{ int i,j;
float sum;
b[n-1]=b[n—1]/a[n—1][n-1];
for(i=n-2;i〉=0;i--)
{sum=0;
for(j=i+1;j<n;j++)
sum=sum+a[i][j]*b[j];
b[i]=(b[i]—sum)/a[i][i];
}
printf("结果:\n”);
for(i=0;i<n;i++)
printf(”x%d=%f\n",i+1,b[i]);
}
void main()
{ input();
gaosi();
qiujie();
}
编写用拉格朗日线性插值多项式求
0
3
11
sin
o
¢
实验三、给定
207912
.
0
12
sin
,
190809
.
0
11
sin
o
o
o
=
=
近似值的程序并估计余项。
。
1。实验目的:程序实现用拉格朗日插值法计算函数的近似值。
2.实验内容和要求:编写拉格朗日插值公式求函数的近似值的程序,并上机调试和运行。记录所用的函数,及程序的输入输出数据并分析误差。
3.算法描述: 拉格朗日插值法计算函数的近似值
(1)输入节点(xi,yi), i=0,1,…,n,以及x,令Ln(x)=0;;
(2)对i=0,1,…,n,计算
;
;
(3)输出。
4.程序运行结果
5.结果评价
程序结果运行完整,且计算正确,虽然是在题目中直接给出了初始数据,但是这样就减少了输入数据的麻烦过程.
6实验结论
此实验要求我们掌握朗格朗日插值的思想过程,熟悉朗格朗日的算法,并用拉格朗日公式计算近似值,而且能计算出截断误差,实验的时候我开始根本不晓得怎么进行,但是一步步来了,最终能够得到结果了,相信拉格朗日能编写出来,牛顿插值法应该在这个基础上就不难了,以后学习多写程序,尤其是作为计算机的学生,不会写程序真的对不起这个专业。
7源程序
#include〈iostream。h〉
#include<math.h>//确定要计算的角度值
#define N 11.5//利用宏定义线性插值函数
#define L(a) (a-x_1)/(x_0-x_1)*y_0+(a-x_0)/(x_1—x_0)*y_1//利用宏定义函数,该函数用以将x0与x1逐步接近
#define X(M,n) int(M*pow(10,n)/10)/pow(10,n—1)
void main(){
double x_0=11,x_1=12,y_0=0。190809,y_1=0.207912,temp=N,temp1;
for(int i=3;i〈=6;i++)
{temp1=X(temp,i) ;
y_0=L(temp1);
if(i==6)
break;
x_0=X(temp,i);
}
//输出运算结果
cout<〈"经用线性插值法计算知sin(0。57891)的近似值为:"<〈y_0〈<endl;
//输出截断误差限
cout〈<”截断误差限为:”<<sin(x_1)*(fabs((N—x_0)*(N-x_1))/2)<<endl;
}
展开阅读全文