共轭梯度法C语言(西安交大)

合集下载

最优化方法-共轭方向和共轭梯度法

最优化方法-共轭方向和共轭梯度法

PkT1QPk

PkT1Q f
(X k
)

f
( X k )T QPk 1 PkT1QPk 1
Pk 1 0

且对j 0,1 , k 2, 有
2020/3/6
21
Biblioteka Baidu
3.共轭梯度法
证明
PjT QPk PjT Q f ( X k ) P k1 k1
共轭方向和共轭梯度法
2020/3/6
1
本节主要内容
1 共轭方向法的基本原理 2 共轭方向(定义+性质+方法) 3 共轭梯度法 4 例题 5 小结
2020/3/6
2
基本原理
2020/3/6
3
1.共轭方向法的基本原理
先看一个无约束极小化问题:
min f (x) 1 X T QX bT X c,Q为正定矩阵 2
P1应该满足的条件:X2=X1+λ1P1 (λ1为最优步长)
∵X2是无约束极小值点 ∴▽f(X2)=0 即QX2+b=0
P1要如何求呢?
(▽f(X)=QX+b)
有 f ( X 1 ) QX1 b
Q( X 2 1P1 ) b (QX 2 b) Q1P Q1P
与10是正交的,但是它们不是Q的共轭向量。而向量11与-11既是正交的, 又是Q的共轭。

共轭梯度法

共轭梯度法

g j1
j
gj
id (i)T Ad ( j)
当j=i时,把(8)代入上式第一个等号的右端,立得
d (i1)T Ad ( j) 0
4.4共轭梯度法
当j<i时,由前面已经证明的结论和归纳假设,式中
第2个等号右端显然为0,因此
d (i1)T Ad ( j) 0 最后证3),易知
d (1)T Ad (2) 0 即等值面上一点x(1)处的切向量与由这点指向极小 点的向量关于A共轭.
4.4共轭梯度法
x2
d (1) x d (2) x(1)
x1
4.4共轭梯度法
算法4.4 共轭方向法 Step1(初始化),给定初始点x0 Rn ,计算f (x0 ),给定 一个搜索方向d 0 0,使得f (x0 )T d 0 0;置k 0
Hesteness和Stiefel于1952年为解线性方程组而提出
•基本思想:把共轭性与最速下降法相结合,利用已 知点处的梯度构造一组共轭方向,并沿着这组方 向进行搜索,求出目标函数的极小点
4.4共轭梯度法
先讨论对于二次凸函数的共轭梯度法,考虑问题
min f (x) 1 xT Ax bT x c
(1)
2
x En, A对称正定,c是常数.
求解方法
首先, 任意给定一初始点x(1),计算出目标函数在

共轭梯度法C语言(西安交大)

共轭梯度法C语言(西安交大)

#include<stdio.h>

#include<math.h>

#define N 10 /*定义矩阵阶数*/

void main()

{

int i,j,m,A[N][N],B[N];

double X[N],akv[N],dka[N],rk[N],dk[N],pk,pkk,ak,bk;

for(i=0;i<N;i++) /*输入系数矩阵A*/ {

for(j=0;j<N;j++)

{

if(i==j)

A[i][j]=-2;

else if(abs(i-j)==1)

A[i][j]=1;

else

A[i][j]=0;

}

}

for(i=0;i<N;i++) /*输入矩阵B*/ {

if(i==0||i==N-1)

B[i]=-1;

else

B[i]=0;

}

printf("\n"); /*输出系数矩阵A*/

printf("the Maxtr A is\n");

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

{

printf("\n");

for(j=0;j<N;j++)

printf("%3d",A[i][j]);

}

printf("\n"); /*输出矩阵B*/

printf("the Maxtr b is\n");

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

printf("%3d",B[i]);

printf("\n");

printf("input the Maxtr X\n"); /*给X0输入一个初始向量*/ for(i=0;i<N;i++)

X[i]=0;

printf("X chushi:\n");

西安交大计算方法A考点总结【1-9章】

西安交大计算方法A考点总结【1-9章】

A
矩阵 A 的谱半径 定理:设
A
是矩阵 A 的
i
的最大值(谱半径不超过 A 的任一种范数)
1
B 1,则 I B 是可逆矩阵,且 I B

1 1 B
8、舍入误差对解的影响 设线性方程组 Ax=b 的系数矩阵 A 和右端项 b 各有微小扰动 A 和 b , 扰动后的方程组
为了避免大数吃小数问题, 对于若干个数相加时, 宜采取绝对值较小的数先加的原则; 为了减少舍入误差,节省计算时间,在计算时应尽量简化计算步骤,减少运算次数。 4、数学问题的条件数:
xi 和 ; xi y xi
条件数很大的问题成为病态问题:数据发生微小的变化将引起解发生剧烈变化的问题, 这是数学问题的固有特征。 凡是计算结果接近零的问题往往是病态问题, 因此在实际计算中要避免两个相近的数字 相减。 实际计算中,要避免绝对值很大的数作乘数、绝对值很小的数作除数。 5、舍入误差可控或舍入误差的积累不影响产生可靠的计算结果,则该算法数值稳定。 应采用算法数值稳定性好的算法。 第二章 1、高斯消去法(消元+回代)消元:将其化为一个等价的同解的上三角方程组 运算量:消元过程乘除法的运算量为:
计算方法 A 知识点总结 仅供参考[2014 级化机]

A A x x b b ,当
A1 A 1 Байду номын сангаас1

4.4共轭方向法4.5 共轭梯度法

4.4共轭方向法4.5 共轭梯度法

2
即 V 与 d j 是互相正交的(即互相垂直)。 因此,G 的共轭向量的几何意义为:若向量 d i(或 d j )经过 线性变换 (G) 后,变成了一个与 d i(或 d j )相正交的向量。
当 G I (单位矩阵)时,
即正交关系。 (d1)T Gd 2 d1d 2 0
性质1 若非零向量系 d 0 , d1,• • •, d m1 是对 G 共轭的, 则这 m 个向量是线性无关的。
1.2 共轭向量的几何意义及共轭方向的性质
对 (d i )T Gd j 0 ,若令 (Gd j ) V
则 (d i )T V 0 ,即
(d i )T • V • cos 0 ,
2
即 d i 与 V 是互相正交的(即互相垂直)。
或令 (d i )T G V ,则 Vd j 0

V • d j • cos 0 ,
3x1 2
x2
x1
x2
x11
0 0
x2 1
计算 X 2 点的海塞矩阵
H
3,1 1,1
是正定的,所以 X 2 点是极小点。
X
X
2
1 1
函数的极小值为
f (X ) 1
MATLAB演示
例1
f (X ) 2x12 6x22 2x1x2 2x1 3x2 3
共轭方向法
例2

3_共轭梯度法

3_共轭梯度法
共轭方向法和共轭梯度法
问题1:
如何建立有效的算法?
从二次模型到一般模型.
问题2: 什么样的算法有效呢? 二次终止性.
简介
共轭方向法和共轭梯度法
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导 数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储 和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组 最有用的方法之一,也是解大型非线性最优化最有效的算法之一.
共轭方向法和共轭梯度法
特点 (1) 建立在二次模型上,具有二次终止性. (2) 一种有效的算法,克服了最速下降法的锯齿现象, 又避免了牛顿法的计算量大和局部收敛性的缺点. (3) 算法简单,易于编程,无需计算二阶导数,存储 空间小等优点,是求解中等规模优化问题的主要 方法.
共轭方Fra Baidu bibliotek法
定义--共轭方向
共轭梯度法
举例
参见 P187 例7.3.1.
收敛性分析
共轭梯度法
与Newton法相比,共轭梯度 全局收敛性 法具有较弱的收敛条件.

共轭梯度法
优点
收敛速度优于最速下降法,存贮量小,计算简单 . 适合于优化变量数目较多的中等规模优化问题. 缺点
当 p0 f ( X 0 ) 时,收敛速度是线性的. 收敛速度 不如Newton法快.

共轭梯度法

共轭梯度法

首先建立坐标系, 如右图所示
容易看出椭圆O在以O为原点的 y' 坐标系Oxy中的方程为 :
x2 r2
r2
y2 cos 2
1
S'
它是二次函数
f (x, y) 1 (x2cos2 y2 ) y
2 的一条等值线
S
二次函数的矩阵为
A1'
x'
P1'
A0'
P0' O '
A1 P1
P0 O
A0
x
Q
cos 2
f (x2 )
x0 d0 d1 x2
S1
x1
过点x0由向量d 0 和d1张成的平面是S1 , 且f (x2 ) S1
定理的证明:分两步
先证第一部分 : f (xk1)T d j 0, j k 1 若 j k,由精确搜索, 显然有:f (xk)T dk
0 j k,由于
f ( xk1 ) f ( xk ) kQd k f ( xk-1 ) kQd k k-1Qd k-1
推论 在Rn中,相互共轭的向量组的向量个数不超过n
利用共轭方向, 我们提出求二次函数(5.2)的极小值问题 的共轭方向法
从某个初始点 x0出发, 依次沿关于Q共轭的n个方向
思想 d0 , d1, , dn-1 进行精确搜索

实验6 最速下降法 2

实验6 最速下降法 2

《数值分析》实验6

一.实验名称:最速下降法

二、实验目的:

熟悉求解线性方程组的共轭梯度法。

三、实验要求

(1) 按照题目要求完成实验内容

(2) 写出相应的C 语言程序

(3) 给出实验结果

(4) 写出相应的实验报告

四、实验题目

1.最速下降法

用最速下降法求解线性方程组AX b =,保留5位有效数字(err =1e-5),其中A=[2 -1 -1;-1 2 0;-1 0 1]; b=[0 ;1; 0]。

2.用最速下降法求解方程组

1234564101000141010501400101

00410601014120010146x x x x x x ⎡⎤--⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥--=⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎣⎦⎣⎦

⎣⎦ 要求精度0.00001ε=,初始00=x ,最大迭代次数N=25。

3. 选做: 用共轭梯度法求解上面的方程。

1.程序:

#include

#include

int main()

{

int n = 3, i, k, j, mm = 1000;//最大迭代次数mm; float t, rar, rr, rr_rar, ari, x[mm][n], r[n], dx[n], dx_norm = 1, err = 1e-5, w =

1.3;//精度err

float a[][3] = { 2, -1, -1, -1, 2, 0, -1, 0, 1 };

float b[3] = { 0, 1, 0 };

printf("(a[%d][%d],b[%d][1])=\n", n, n, n);

共轭梯度法原理

共轭梯度法原理

共轭梯度法原理

共轭梯度法是一种用于求解大型稀疏线性方程组的优化算法。

它是一种迭代法,通过寻找一个搜索方向,并在该方向上进行搜索,逐步逼近最优解。共轭梯度法在优化问题中有着广泛的应用,尤其

在求解大规模线性方程组时表现出色。

共轭梯度法的原理可以从最小化函数的角度进行解释。假设我

们要最小化一个二次函数f(x),其中x是一个n维向量。共轭梯度

法的目标是找到一个搜索方向d,使得沿着这个方向移动能够让函

数值最小化。在每一步迭代中,我们需要找到一个合适的步长α,

使得沿着搜索方向d移动后能够使函数值减小最快。

共轭梯度法的核心思想是利用历史信息来加速收敛。在每一步

迭代中,共轭梯度法会根据历史搜索方向的信息来选择当前的搜索

方向,以便更快地找到最优解。这种方法可以在较少的迭代次数内

找到最优解,尤其对于大规模问题来说,可以节省大量的计算资源。

在实际应用中,共轭梯度法通常用于求解线性方程组Ax=b,其

中A是一个对称正定矩阵。共轭梯度法的迭代过程可以通过以下步

骤进行描述:

1. 初始化,选择一个初始解x0,计算残差r0=b-Ax0,选择初

始搜索方向d0=r0。

2. 迭代更新,在第k步迭代中,计算步长αk,更新解xk=xk-

1+αkd,并计算残差rk=b-Axk。然后根据历史搜索方向的信息,计

算新的搜索方向dk= rk+βkdk-1,其中βk是一个根据历史信息计

算得到的参数。

3. 收敛判断,在每一步迭代中,可以根据残差的大小来判断算

法是否已经收敛。如果残差足够小,可以停止迭代并得到近似解x。

共轭梯度法的优点在于它对存储和计算资源的要求相对较低,

共轭梯度法总结

共轭梯度法总结

共轭梯度法(Conjugate Gradient Method)总结

1. 引言

共轭梯度法是一种用于求解线性方程组或优化问题的迭代算法。它在大规模问题上具有较高的效率和收敛速度,并且不需要存储完整的矩阵。共轭梯度法最早由Hestenes和Stiefel于1952年提出,后来经过多次改进和推广,成为求解稀疏线

性方程组和优化问题的重要工具。

2. 基本原理

共轭梯度法的基本思想是利用共轭方向的性质,通过一系列迭代来逼近最优解。对于一个对称正定矩阵A和一个向量b,我们希望找到一个向量x使得Ax=b成立。

通过引入残差r=b-Ax,我们可以将问题转化为求解残差最小化的问题。定义两个

向量d和g满足以下关系:d_i^TAd_j=0 (i≠j),则称d_i与d_j是关于矩阵A共轭的。在每次迭代中,选择与之前所有搜索方向都共轭的搜索方向,并沿着该方向进行搜索。

3. 算法流程

步骤1:初始化

给定初始解x_0,计算初始残差r_0=b-Ax_0,并令搜索方向d_0等于r_0。

步骤2:迭代

重复以下步骤直到满足收敛条件: - 计算当前搜索方向的梯度g_k=Ad_k。 - 计

算步长alpha_k=r_k Tr_k/(d_k TAd_k)。 - 更新解x_{k+1}=x_k+alpha_k d_k。 - 更新

残差r_{k+1}=r_k-alpha_k Ad_k。 - 计算新的搜索方向

d_{k+1}=r_{k+1}+beta_{k+1}d_k,其中

beta_{k+1}=r_{k+1}^T r_{k+1}/(r_k^T*r_k)。

共轭梯度法求解方程组

共轭梯度法求解方程组

共轭梯度法是一种常用的迭代方法,用于求解线性方程组Ax = b。它适用于对称正定矩阵的情况,可以高效地求解大规模的线性方程组。下面是使用共轭梯度法求解方程组的一般步骤:1. 初始化:选择一个初始解x0 和初始残差r0 = b - Ax0,设置初始搜索方向d0 = r0。

2. 迭代计算:进行迭代计算,直到满足停止准则(如残差的大小或迭代次数达到一定阈值)为止。

a. 计算步长αk = (rk^T rk) / (dk^T A dk),其中rk = b - A xk 是当前的残差。

b. 更新解xk+1 = xk + αk dk。

c. 计算新的残差rk+1 = rk - αk A dk。

d. 计算新的搜索方向dk+1 = rk+1 + (rk+1^T rk+1) / (rk^T rk) dk。

e. 更新迭代次数k = k + 1。

3. 输出解:当满足停止准则时,输出最终的解x。

需要注意的是,共轭梯度法的效率和收敛速度与矩阵的条件数有关。对于病态矩阵或条件数较大的情况,可能需要进行预处理或使用其他更适合的求解方法。此外,共轭梯度法还可以应用于非线性方程组的求解,采用牛顿法等方法来迭代求解。

在实际应用中,可以使用现有的数值计算库或软件来实现共轭梯度法,以提高计算的效率和精度。

共轭梯度法

共轭梯度法

共轭梯度法

1. 算法原理

求解一个系数矩阵为正定矩阵的线性方程组可通过求泛函)(x f 的极小值点来获得,进而可以利用共轭梯度法来求解。

共轭梯度法中关键的两点是,确定迭代格式)()()1(k k k k d x x α+=+中的搜索方向)(k d 和最佳步长k α。实际上搜索方向)

(k d

是关于矩阵A 的共轭向量,在迭代中逐步构造之;步长

k α的确定原则是给定迭代点)(k x 和搜索方向)(k d 后,要求选取非负数k α,使得

)()()(k k k d x f α+达到最小,

即选择0≥k α,满足)(min )()

()(0)()(k k k k k d x f d x f k

ααα+=+≤。 设迭代点)

(k x

和搜索方向)

(k d

已经给定,k α可以通过一元函数)

()()()

(k k d x

f g αα+=的极小化)()(min )()

(0k k d x

f g ααα

+=≤来求得,所以最佳步长)

()()()(k k k k k Ad

d

d r T

T

=

α。

在给定初始向量)

0(x 后,由于负梯度方向是函数下降最快的方向,故第1次迭代取搜索

方向)0()0()0()

0()(Ax b x f r d

-=-∇==。令)0(0)0()1(d x x α+=,其中)

0()0()0()0(0Ad

d

d r T

T

=

α。

第2次迭代时,从)

1(x 出发的搜索方向不再取()

1r

,而是选取)0(0)1()1(d r d β+=,使得)

1(d

()0d 是关于矩阵A 的共轭向量,即要求)1(d 满足()()()

0,01=Ad d ,由此可求得参数

计算方法——共轭梯度法求解线性方程组

计算方法——共轭梯度法求解线性方程组

|| r ||2 k k 22 ; || r ||2
d
k 1
r
k 1
k d ;
k
end do
图 1 共轭梯度法求解线性方程组程序框图
1.2 程序使用说明 共轭梯度法求解线性方程组的 matlab 程序见附录 1,该程序可以求解系数矩阵为 对称正定矩阵的线性方程组。在使用该程序时,可将程序复制到 matlab 命令窗口中直 接运行或者复制到编辑窗口中保存运行,运行时刻根据提示输入,直至得到结果。 开始运行程序时,会出现提示“请选择系数矩阵、右端项以及系数矩阵阶数的输
2
计算方法上机报告
入方式:从文件中输入数据输入 1,从命令窗口输入数据请输入 2。 ”此时需要选择数 据输入的方式(方式 1 和方式 2) ,即文件输入(选择 1)或者手动输入(选择 2) 。当 线性方程组 Ax = b 的系数矩阵的阶数较大时,将该系数矩阵 A、右端项 b 以及系数矩 阵的阶数 n 保存为 txt 格式放在 D 盘的根目录下并分别命名为 data_A、 data_b 和 data_n, 并输入 1 选择文件输入。若系数矩阵 A 的阶数较小,使用手动输入工作量小时,可在 命令框中输入 2 选择手动输入。选择手动输入时需要输入系数矩阵 A、右端项 b 以及 系数矩阵的阶数 n 这三个量,其输入格式与 matlab 中矩阵、列向量和数的输入格式要 求相同。A=[aij]n×n 的输入格式为[a11,a12,…,a1n;a21,a22,…,a2n;…;an1,an2,…,ann],b=(bi)T 的 输入格式为[b1;b2;…;bn], n 直接输入对应的数值即可。 定义完需要求解的线性方程组之 后,接下来会出现提示“输入计算要求的精度 epsilon: ” ,按照提示输入精度值,如要 求的精度为 10-6 时输入 1e-6 即可。以上数据的输入全部完成,每次按提示输入完成时 按 Enter 键继续下一步。在程序运行过程中,屏幕上会显示残差||r||2 随着迭代步数的变 化散点图,程序运行完成之后,matlab 命令窗口会显示线性方程的解 x,同时该解会被 保存到 D 盘根目录下名为 data_x_result 的 Excel 文件中,方便之后的数据处理(注意 在求解一个新方程组之前查看 D 盘根目录,将上次得到的文件删除,以免影响本次计 算的结果) 。 1.3 算例计算结果 (1) 《数值分析》课本第 29 页的例题 2.2.2,下面采用共轭梯度法来求解线性方程 组 Ax = b,其中

共轭梯度算法

共轭梯度算法

共轭梯度算法

共轭梯度算法(Conjugate Gradient)是介于与法之间的一个方法,它仅需利用一阶信息,但克服了最速下降法收敛慢的缺点,又避免了法需要存储和计算Hee并求逆的缺点,共轭梯度算法不仅是解决大型最有用的方法之一,也是解大型非线性最优化最有效的算法之一、在各种优化算法中,共轭梯度算法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

FR共轭梯度法

FR共轭梯度法

/*min f(x)=x1^2-2*x1*x2+4*x2^2+x1-3*x2 初值,x=(1,1)*/

//FR共轭梯度法

#include<stdio.h>

#include<math.h>

#include <stdlib.h>

float buchang(float p[2])

{float a;

a=(p[0]*p[0]+p[1]*p[1])/(2*p[0]*p[0]-4*p[0]*p[1]+8*p[1]*p[1]);

return a;

}

float buchang1(float p[2],float g[2])

{float a;

a=-1*(p[0]*g[0]+p[1]*g[1])/(2*g[0]*g[0]-4*g[0]*g[1]+8*g[1]*g[1]);

return a;

}

main()

{float a=0,b=0,c=0,d=0,x[2],p[2],g[2]={0,0},e=0.000001,mo;

int i=0;

x[0]=1.0;

x[1]=1.0;

p[0]=2*x[0]-2*x[1]+1;

p[1]=-2*x[0]+8*x[1]-3;

g[0]=-p[0];

g[1]=-p[1];

a=buchang(g);

printf("\n\n");

while(!(p[0]<e&&p[1]<e))

{

c=p[0]*p[0]+p[1]*p[1];

x[0]=x[0]+a*g[0];

x[1]=x[1]+a*g[1];

p[0]=2*x[0]-2*x[1]+1;

p[1]=-2*x[0]+8*x[1]-3;

共轭梯度法

共轭梯度法

共轭梯度法

简介

共轭梯度法是一种迭代的最优化算法,用于求解线性方程组或求解非线性优化问题。它在解决大规模线性方程组时表现出色,尤其适用于对称正定矩阵的问题。共轭梯度法结合了最速下降法和共轭方向法的优点,能够在有限次数的迭代中快速收敛到最优解。

背景

在数值计算和优化问题中,线性方程组的求解是一个常见且重要的问题。例如,在图像处理、数据分析和机器学习等领域,我们经常需要求解一个大规模的线性方程组。然而,传统的直接方法,如高斯消元法或LU分解,对于大规模问题往往计算量巨大,耗时较长。因此,我们需要寻找一种高效的迭代方法来解决这些问题。

共轭梯度法的核心思想是通过一系列共轭的搜索方向来逼

近最优解。具体来说,对于一个对称正定的线性方程组Ax=b,共轭梯度法的步骤如下:

1.初始化解向量x0和残差x0=x−xx0。

2.计算初始搜索方向x0=x0。

3.进行共轭梯度迭代:重复以下步骤n次或直到收敛

为止。

a.计算步长

$\\alpha_k=\\frac{r_k^Tr_k}{d_k^TAd_k}$。

b.更新解向量$x_{k+1}=x_k+\\alpha_kd_k$。

c.更新残差$r_{k+1}=r_k-\\alpha_kAd_k$。

d.计算新的搜索方向

$d_{k+1}=r_{k+1}+\\frac{r_{k+1}^Tr_{k+1}}{r_k^Tr_k

}d_k$。

共轭梯度法与其他迭代方法相比有以下特点:

1.高效性:共轭梯度法能够在有限次数的迭代中收敛

到最优解,尤其适用于对称正定矩阵。相比于直接方法,其计算量较小,具有更高的计算效率。

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

#include

#include

#define N 10 /*定义矩阵阶数*/

void main()

{

int i,j,m,A[N][N],B[N];

double X[N],akv[N],dka[N],rk[N],dk[N],pk,pkk,ak,bk;

for(i=0;i

for(j=0;j

{

if(i==j)

A[i][j]=-2;

else if(abs(i-j)==1)

A[i][j]=1;

else

A[i][j]=0;

}

}

for(i=0;i

if(i==0||i==N-1)

B[i]=-1;

else

B[i]=0;

}

printf("\n"); /*输出系数矩阵A*/

printf("the Maxtr A is\n");

for(i=0;i

{

printf("\n");

for(j=0;j

printf("%3d",A[i][j]);

}

printf("\n"); /*输出矩阵B*/

printf("the Maxtr b is\n");

for(i=0;i

printf("%3d",B[i]);

printf("\n");

printf("input the Maxtr X\n"); /*给X0输入一个初始向量*/ for(i=0;i

X[i]=0;

printf("X chushi:\n");

for(i=0;i

/*开始计算*/

for(i=0;i

{

pk=0.0;

for(j=0;j

pk+=A[i][j]*X[j];

akv[i]=pk;

}

for(i=0;i

rk[i]=B[i]-akv[i];

for(i=0;i

dk[i]=rk[i];

for(m=0;m

{

for(i=0;i

{

pk=0.0;

for(j=0;j

pk+=A[i][j]*dk[j];

dka[i]=pk;

}

pk=0.0;pkk=0.0;

for(i=0;i

{

pk+=dka[i]*dk[i];

pkk+=rk[i]*rk[i];

}

if(pkk==0) /*如果残差pkk=0,计算结束*/ break;

ak=pkk/pk;

for(i=0;i

X[i]=X[i]+ak*dk[i];

for(i=0;i

{

pk=0.0;

for(j=0;j

pk+=A[i][j]*X[j];

akv[i]=pk;

}

for(i=0;i

rk[i]=B[i]-akv[i];

pk=0.0;

for(i=0;i

pk+=rk[i]*rk[i];

bk=pk/pkk;

for(i=0;i

dk[i]=rk[i]+bk*dk[i];

}

printf("\n");

printf("X cacualtate value is:\n"); /*输出运算结果X*/

for(i=0;i

printf("%f\n",X[i]);

}

相关文档
最新文档