这个代码的本意是对比BP算法和改进的BP算法求解广义逆矩阵的结果以及他们结果的误差对比图,但是代码求出来的没有误差,但是用pinv函数计算得到的有误差,突出不了改进的BP算法的优越性,想修改一下算法突出其优越性,目标误差需要这么大但是gradient(梯度不兼容),怎么修改比较好,急!希望能得到建议!
% 示例矩阵 A
A = [4 1 0;3 0 3];
% 目标误差
target_error = 1e-16;
% BP算法求解广义逆矩阵
function G = BP_algorithm(A, target_error)
% 初始化G矩阵
G = pinv(A);
error = norm(A * G * A - A, 'fro');
while error > target_error
% 计算梯度
gradient = -2 * (A' * (A * G - A));
% 更新G矩阵
G = G + 0.1 * gradient; % 这里的学习率可以根据需要调整
error = norm(A * G * A - A, 'fro');
end
end
% 改进的BP算法求解广义逆矩阵
function G = improved_BP_algorithm(A, target_error)
% 初始化G矩阵
G = pinv(A);
error = norm(A * G * A - A, 'fro');
while error > target_error
% 计算梯度
gradient = -2 * (A' * (A * G - A) * A);
% 更新G矩阵
G = G + 0.1 * gradient; % 这里的学习率可以根据需要调整
error = norm(A * G * A - A, 'fro');
end
end
% 调用BP算法求解
G_BP = BP_algorithm(A, target_error);
% 调用改进的BP算法求解
G_improved_BP = improved_BP_algorithm(A, target_error);
% 计算误差
error_BP = norm(A * G_BP * A - A, 'fro');
error_improved_BP = norm(A * G_improved_BP * A - A, 'fro');
% 打印误差
fprintf('BP算法求解的误差: %f\n', error_BP);
fprintf('改进的BP算法求解的误差: %f\n', error_improved_BP);
% 绘制误差对比图
figure;
plot([1, 2], [error_BP, error_improved_BP], '-o', 'LineWidth', 2); % 使用'-'线型和'o'标记点
xticks([1, 2]);
xticklabels({'BP算法', '改进的BP算法'});
ylabel('误差');
title('BP算法与改进的BP算法求解广义逆矩阵的误差对比');
grid on; % 添加网格线以增强可视化效果