计算方法实验
—(14级计算机科学与技术2班)
实验仪器和环境:PC-机、codeblocks 10.05、MATLAB R2013a
编程语言:C、C++、MATLAB
实验一:编写程序求多项式的和
实验目的:
比较两种求和方法发计算复杂度,通过比较两种程序的运行时间来实现。
实验内容:
计算多项式:
方法一:一般算法,程序运行过程中,所算乘法次数为 ,由于所加项共(n+1)项,则加法次数为n,C语言代码实现如下:
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
double a[100005];
int main()
{
double second1,second2;
second1=(double)clock()/CLOCKS_PER_SEC;//clock()函数返回值本为毫秒,除以CLOCK_PER_SEC之后单位即变为秒
int n,x;
double mul,sum;
n=10000;//记得给n更换取值看所用时间的差别
x=1;//防止数据过大超范围,将x初始化为1
sum=0;
for(int i=0;i<=n;i++)
{
a[i]=1;//防止数据过大超范围,初始化为1
}
for(int i=0;i<=n;i++)
{
mul=1;
for(int j=0;j<i;j++)
{
mul*=x;
}
mul*=a[i];
sum+=mul;
}
cout<<"Pn(x)="<<sum<<endl;
second2=(double)clock()/CLOCKS_PER_SEC;
cout<<"second1="<<second1<<endl;
cout<<"second2="<<second2<<endl;
cout<<"用时为: "<<second2-second1<<endl;
return 0;
}
n=10000时,输出结果为:
Pn(x)=10001
second1=0
second2=0.465
用时为: 0.465
n=100000时,输出结果为:
Pn(x)=100001
second1=0
second2=29.317 用时为: 29.317
方法二:秦九昭算法,已知递推公式为: ,u[n]即为所求结果,则整个过程中共进行了n次加法和n次乘法,C语言代码实现如下:
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstring>
using namespace std;
double a[100005];
double u[100005];
int main()
{
double second1,second2;
second1=(double)clock()/CLOCKS_PER_SEC; //clock()函数返回值本为毫秒,除以CLOCK_PER_SEC之后单位即变为秒
int n,x;
n=100000;//记得给n更换取值看所用时间的差别
x=1;//防止数据过大超范围,将x初始化为1
memset(u,0,sizeof(u));
for(int i=0;i<=n;i++)
{
a[i]=1;
}
u[0]=a[n];
for(int i=1;i<=n;i++)
{
u[i]=u[i-1]*x+a[n-i];
}
cout<<"Pn(x)="<<u[n]<<endl;
second2=(double)clock()/CLOCKS_PER_SEC;
cout<<"second1="<<second1<<endl;
cout<<"second2="<<second2<<endl;
cout<<"用时为: "<<second2-second1<<endl;
return 0;
}
当n=10000时,输出为:
Pn(x)=10001
second1=0.001
second2=0.002
用时为: 0.001
当n=100000时,输出为:
Pn(x)=100001
second1=0.001
second2=0.003
用时为: 0.002
经比较,秦九韶算法比普通的算法快得多,算法更加优化,运算时间更短,复杂度更小,且当n越大时,这种差距体现的更加明显,所以秦九韶算法是一种非常好的方法。
实验二:求解线性方程组的解
实验目的:
用雅克比迭代法和高斯-赛德尔迭代法解线性方程组Ax=b,式中A为非奇异实矩阵。在给定迭代初值的情况下,进行迭代,直到满足精度要求。
实验内容:
试分别用雅克比迭代法,高斯-赛德尔迭代法解线性方程组:
方法一:用雅克比迭代法求解线性方程组
MATLAB代码实现:
yakebi.m文件函数实现:%函数名和文件名一致
%A=[5,1,-1,-2;2,8,1,3;1,-2,-4,-1;-1,3,2,7];
% b=[-2;-6;6;12];
function Y=yakebi(A,b)
if(any(diag(A))==0)
error('error,pause')
end
eps=input('误差限eps=');
N=input('迭代次数N=');
D=diag(diag(A));
B=inv(D)*(D-A);
f=inv(D)*b;
K=0;
x0=zeros(size(b));
while 1
x1=B*x0+f
K=K+1;
fprintf('第%d次迭代的近似解为',K)
disp(x1');
if norm(x1-x0,inf)<eps
fprintf('满足精度要求的解为\n')
disp(x1');
break
end
if K>N
fprintf('迭代超限')
end
x0=x1;
end
Command Window 中实现:
>> A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-13 2 7];
>> b=[-2 -6 6 12]';
>> yakebi(A,b);
误差限eps=0.00001;
迭代次数N=50;
x1 =
-0.4000
-0.7500
-1.5000
1.7143
第1次迭代的近似解为 -0.4000 -0.7500 -1.5000 1.7143
x1 =
0.1357
-1.1054
-1.6536
2.4071
第2次迭代的近似解为 0.1357 -1.1054 -1.6536 2.4071
x1 =
0.4532
-1.4799
-1.5152
2.6798
第3次迭代的近似解为 0.4532 -1.4799 -1.5152 2.6798
x1 =
0.6649
-1.6788
-1.3167
2.8462
第4次迭代的近似解为 0.6649 -1.6788 -1.3167 2.8462
x1 =
0.8109