共轭梯度法matlab代码

共轭梯度法是一种用于解决优化问题的迭代方法,特别适用于解线性方程组或最小化二次型的问题。

matlab
function x = conjugate_gradient(A, b, x0, tol, max_iter) % 输入参数: % A: 系数矩阵 % b: 右侧向量 % x0: 初始解 % tol: 收敛精度 % max_iter: 最大迭代次数 % 初始化 x = x0; r = b - A * x; p = r; rsold = r' * r; % 迭代 for k = 1:max_iter Ap = A * p; alpha = rsold / (p' * Ap); x = x + alpha * p; r = r - alpha * Ap; rsnew = r' * r; if sqrt(rsnew) < tol disp(['共轭梯度法在第 ', num2str(k), ' 次迭代时达到收敛']); break; end p = r + (rsnew / rsold) * p; rsold = rsnew; end if k == max_iter disp('共轭梯度法未达到指定的收敛精度'); end end

你可以调用这个函数,传入系数矩阵 A、右侧向量 b、初始解 x0、收敛精度 tol 和最大迭代次数 max_iter。例如:

matlab
A = [4, -1, 0; -1, 4, -1; 0, -1, 4]; b = [15; 10; 10]; x0 = [0; 0; 0]; tol = 1e-6; max_iter = 100; x = conjugate_gradient(A, b, x0, tol, max_iter); disp('最终解:'); disp(x);

matlab
function x = conjugate_gradient(A, b, x0, tol, max_iter) % 输入参数: % A: 系数矩阵 % b: 右侧向量 % x0: 初始解 % tol: 收敛精度 % max_iter: 最大迭代次数 % 初始化 x = x0; r = b - A * x; p = r; rsold = r' * r; % 迭代 for k = 1:max_iter Ap = A * p; alpha = rsold / (p' * Ap); x = x + alpha * p; r = r - alpha * Ap; rsnew = r' * r; % 检查收敛 if sqrt(rsnew) < tol disp(['共轭梯度法在第 ', num2str(k), ' 次迭代时达到收敛']); break; end % 更新搜索方向 beta = rsnew / rsold; p = r + beta * p; rsold = rsnew; end % 输出结果 if k == max_iter disp('共轭梯度法未达到指定的收敛精度'); else disp('最终解:'); disp(x); end end

在这个改进版本中,增加了对搜索方向的更新以及对收敛的检查。这样的调整可以提高算法的稳定性和收敛性。

使用这个函数时,可以传入不同的系数矩阵和右侧向量,使其适用于不同的线性方程组求解问题。