直接法解线性方程组 高斯 追赶 插值算法 拉格朗日 牛顿核心代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一 直接法解线性方程组
一、实验目的
掌握列选主元消去法与追赶法解线性方程组。

二、实验内容
分别写出Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。

实验中以下列数据验证程序的正确性。

1、用Guass 列选主元消去法求解方程组 ⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--5.58
.37.33.47
.11
.85.16.93.51.53.25.2321x x x
2、用追赶法求解方程组 ⎥⎥
⎥⎥⎥⎥⎦⎤
⎢⎢⎢⎢⎢⎢⎣⎡-=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-----00001021
02100002100002100002
54321x x x x x
三、实验仪器设备与材料
主流微型计算机
四、实验原理
1、Guass 列选主元消去法 对于AX =B
1)、消元过程:将(A|B )进行变换为)~
|~
(B A ,其中A ~
是上三角矩阵。

即:
⎪⎪⎪⎪
⎪⎭


⎛→⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n nn
n n n nn
n n n n b a b a b a a b a a a b a a a b a a a
010
12211122
1
222221111211
k 从1到n-1 a 、 列选主元
选取第k 列中绝对值最大元素ik n
i k a ≤≤max 作为主元。

b 、 换行
i
k ij kj b b n k j a a ⇔+=⇔,,1,
c 、 归一化 k
kk k kj kk kj b a b n k j a a a ⇒+=⇒/,,1,/
d 、 消元
n
k i b b a b n k j n k i a a a a i k ik i ij kj ik ij ,,1,,,1;,,1, +=⇒-+=+=⇒-
2)、回代过程:由)~
|~
(B A 解出11,,,x x x n n -。

1
,2,,1,/1
-=⇒-
⇒∑+=n k x x a
b x a b k n
k j j kj
k n
nn n
2、追赶法 线性方程组为: ⎪⎪
⎪⎪
⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝
⎛-----n n n n n n
n n n f f f f f x x x x x a b c a b c a b c a b c a 132********
333
22211
做LU 分解为: ⎪⎪⎪⎪⎪⎪⎪⎪⎭


⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫

⎛=-11
1
1,1
2133
221n n n
R L βββαγαγαγα
分解公式:
⎪⎪⎪⎩

⎪⎪⎨⎧
-===-====-)1,,2,1(),,3,2(,),,3,2(1
11n i c n i b b n i a i i i i i i i i i αββγααγ 则


⎧==⇒=⇒=y Ux f
Ly f LUx f Ax 回代公式: ⎪⎪⎩
⎪⎪⎨

=-==-)
,,3,2(1
111n i y f y f y i i i i i αγα
⎩⎨
⎧--=-==+)
1,,2,1(1
n n i x y x y x i i i i n n β
五、实验步骤
1、理解并掌握列选主元消去法与追赶法;
2、画出列选主元消去法与追赶法的流程图
3、使用VC 语言编写出相应的程序并调试验证通过
1.高斯消元核心代码:
void guass(double a[],int n,double b[],double x[]) { int i,j,m;
double s;
for(i=1,j=0;i<n;i++,j++) { for(m=i;m<n;m++){ s=a[j*n+j]/a[m*n+j]; //printf("%f ",s); //printf("\n");
for(int k=j;k<n;k++) { a[m*n+k]=a[m*n+k]*s-a[(i-1)*n+k];
}
b[m]=b[m]*s-b[i-1];
}
}
for(i=n-1;i>-1;i--)
{
if(i==n-1)
x[i]=b[i]/a[i*n+i];
else
{
s=b[i];
for(j=1;j<n-i;j++)
{
s=s-a[i*n+n-j]*x[n-j];
}
x[i]=s/a[i*n+i];
}
}
}
运行结果如下:
2.追赶法核心代码:
void chase(float a[],int n,float l[],float u[])
{
int i;
for(i=1;i<=n-1;i++)
{
l[i*n+i-1]=a[i*n+i-1];
if(i==1)
l[0]=a[0];
else
l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];
u[(i-1)*n+i-1]=1;
u[(i-1)*n+i]=a[(i-1)*n+i]/l[(i-1)*n+i-1];
}
l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];
u[(i-1)*n+i-1]=1;
}
void solve(int n,float l[],float u[],float f[])
{
float y[4],x[4];
for(int i=1;i<=n;i++)
{
if(i==1)
y[i-1]=f[0]/l[0];
else
y[i-1]=(f[i-1]-l[(i-1)*n+i-2]*y[i-2])/l[(i-1)*n+i-1];
}
for(i=n;i>0;i--)
{
if(i==n)
x[i-1]=y[i-1];
else
x[i-1]=y[i-1]-x[i]*u[(i-1)*n+i];
}
for(i=0;i<n;i++)
printf("%f ",x[i]);
}
运行结果:
七、实验注意事项
注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。

八、思考题
若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。

实验二 插值方法
一、实验目的
掌握拉格郎日插值法与牛顿插值法构造插值多项式。

二、实验内容
分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何一组插值节点,即能解决这一类问题,而不是某一个问题。

实验中以下列数据验证程序的正确性。

已知下列函数表
求x=0.5635时的函数值。

三、实验仪器设备与材料
主流微型计算机
四、实验原理
已知n 个插值节点的函数值,则可由拉格郎日插值公式与牛顿插值公式构造出插值多项式,从而由该插值多项式求出所要求点的函数值。

拉格郎日插值公式与牛顿插值公式如下:
1、Lagrange 插值公式
)
()(...)()()(0
1100x l y y x l y x l y x l x L n
k k k n n n ∑
==
+++=∏
≠=+-+---=
----------=
n
k
j j j
k j n k k k k k k k n k k k x x x x x x x x x x x x x x x x x x x x x x x x x l 0
11101110)
())(())(()())(())(()(
2、Newton 插值公式
)
())(](,,[)
)(](,,[)](,[)()(11010102100100----++--+-+=n n n x x x x x x x x x f x x x x x x x f x x x x f x f x N
五、实验步骤
1、理解并掌握拉格郎日插值法与牛顿插值法的公式;
2、画出拉格郎日插值法与牛顿插值法算法的流程图;
3、使用VC 编写出相应的程序并调试验证通过。

拉格朗日算法核心代码:
float lagrange(int n ,float x[],float f[],float m)
{
float a=1,b=1,s=0;
for(int i = 0; i < n; i ++ ){
for(int j = 0;j < n; j ++)
{
if(j!=i){
a=a*(m-x[j]);
b=b*(x[i]-x[j]);
}
}
s=s+f[i]*a/b;
a=b=1;
}
return s;
}
运行结过果:
牛顿插值算法核心代码:
float newton(int n ,float x[],float f[],float m,float ff[]) {
float a=1,b=1,s=0,p=0;
for(int k = 0; k < n; k ++ ){
for(int j = 0;j <=k; j ++)
{
for(int i = 0;i <=k; i ++){
if(j!=i){
a=a*(x[j]-x[i]);
}
}
s=s+f[j]/a;
a=1;
}
if(k==0){
ff[k]=f[0];}
else{
ff[k]=s;
}
s=0;
}
for(k=0;k<n;k++)
{
if(k>0)
b=b*(m-x[k-1]);
p=p+ff[k]*b;
}
return p;
}
运行结果:
六、实验注意事项
Newton插值法在编程时应注意定义何种数据结构以保存差商。

七、思考题
比较Lagrange插值法与Newton插值法的异同。

相关文档
最新文档