解线性方程组——最速下降法及图形化表示 | 北太天元 or matlab

文章所对应的视频讲解 最速下降法 解线性方程组

一、思路转变

A为对称正定矩阵, A x = b Ax = b Ax=b

求解向量 x x x这个问题可以转化为一个求 f ( x ) f(x) f(x)极小值点的问题,为什么可以这样:

f ( x ) = 1 2 x T A x − x T b + c f(x) = \frac{1}{2}x^TAx - x^Tb + c f(x)=21xTAxxTb+c

可以发现:

∇ f = g r a d f = A x − b \nabla f = \mathrm{grad}f = Ax - b f=gradf=Axb

A A A的正定性可以保证 f ( x ) f(x) f(x)的驻点一定是极小值点。而 A x − b = 0 Ax - b = 0 Axb=0得到的就是 f ( x ) f(x) f(x)的驻点,即:

f ( x ∗ ) = min ⁡ f ( x ) ⇔ ∇ f ( x ∗ ) = A x ∗ − b = 0 f(x^{*}) = \min f(x) \quad \Leftrightarrow \quad \nabla f(x^{*}) = Ax^{*} - b = 0 f(x)=minf(x)f(x)=Axb=0

把解线性方程组的问题,转化为求函数 f ( x ) f(x) f(x)的极小值点。

二、最速下降法

怎么找到这个极小值点?

已知一个多元函数沿其负梯度方向函数值下降得最快。

一种较为形象的解释:

想象自己在半山腰上,要到山脚处:

  • 首先要找好下降方向:负梯度方向
  • 之后沿着选定方向直走
  • 走到不能再下降为止(也就是选定方向的最低点),停下来,再找新的下降方向
  • 重复上面的过程,便能到达山脚

翻译成数学语言

  • 给定任意初值 x 0 x_0 x0,计算残量 r 0 = b − A x 0 r_0 = b - Ax_0 r0=bAx0

  • 选择 P = r 0 P = r_0 P=r0为前进方向,计算:

    α = ( r 0 , r 0 ) ( A r 0 , r 0 ) , x 1 = x 0 + α r 0 \alpha = \frac{\left(r_0, r_0\right)}{\left(Ar_0, r_0\right)}, \quad x_1 = x_0 + \alpha r_0 α=(Ar0,r0)(r0,r0),x1=x0+αr0

  • 重复上面的过程。

算法如下:

三、北太天元 or matlab实现

最速下降法解线性方程组

function [x,k,r] = Gradient_Descent(A,b,x0,e_tol,N)
    % 最速下降法 解线性方程组
    % Input: A, b(列向量), x0(初始值),e_tol: error tolerant, N: 限制迭代次数小于 N 次             
    % Output: x , k(迭代次数), r
    %   Version:            1.0
    %   last modified:      2024/05/19
    n = length(b); k = 0; 
    R = zeros(1,N); % 记录残差
    r = b - A*x0;
    x = zeros(n,N); % 记录每次迭代结果
    x(:,1) = x0;
    norm_r = norm(r,2); R(1) = norm_r;
    while norm_r > e_tol && k < N
        alpha = r'*r/(r'*A*r);  % 计算步长
        x(:,k+2) = x(:,k+1) + alpha * r;
        r = b - A * x(:,k+2); % 残量
        norm_r = norm(r,2);
        R(k+2)=norm_r;
        k = k+1;
    end
    x = x(:,1:k+1); % 返回每次的迭代结果
    r = R(1:k+1);   % 返回每次的残差
    if k>N
        fprintf('迭代超出最大迭代次数');
    else
        fprintf('迭代次数=%i\n',k);
    end
end

四、数值算例

下面例子中统一 $ N=100,e_tol=10^{-8},x_0 = 0 $

例1

A x = b Ax=b Ax=b
A = [ 4 1 0 0 1 4 1 0 0 1 4 1 0 0 1 4 ] b = [ 6 25 − 11 15 ] A=\begin{bmatrix} 4 & 1 & 0 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & 0 & 1 & 4 \end{bmatrix}\quad b= \begin{bmatrix} 6 \\ 25 \\ -11 \\ 15 \end{bmatrix} A= 4100141001410014 b= 6251115

用最速下降法求 x x x ;

实现

clc;clear all,format long;
N = 100; e_tol = 1e-8;
A = [4, 1, 0, 0; 
     1, 4, 1, 0;  
     0, 1, 4, 1; 
     0, 0, 1, 4];
b = [6; 25; -11; 15];
x0 = [0; 0; 0; 0];
[x11, k1, r11] = Gradient_Descent(A, b, x0, e_tol, N);
x_exact = gsem_column(A, b);

% 作图查看误差变化
n = length(b);
k1 = k1 + 1;

% 数值解
figure(1);
plot(1:k1, x11(1,:), '-*r', 1:k1, x11(2,:), '-og', 1:k1, x11(3,:), '-+b', 1:k1, x11(4,:), '-dk');
legend('x_1', 'x_2', 'x_3', 'x_4');
title('每个数值解的变化');

% 残差变化
figure(2);
plot(1:k1, r11, '-*r');
legend('残差');
title('残差变化');

运行后得到


通过这个例子可以初步看到方法是可行的.

例2

下面这个例子我将形象展示最速下降法的实现特点

A = [3 1; 1 5];
b = [-1;1];
c = 0;

对应函数: f ( x , y ) = 1 2 ( 3 x 2 + 2 ⋅ 1 ⋅ x y + 5 y 2 ) − ( − x + y ) + 0 f(x,y)=\frac{1}{2}\left(3x^2+2\cdot1\cdot xy+5y^2\right)-(-x+y)+0 f(x,y)=21(3x2+21xy+5y2)(x+y)+0

三维表示一下

clc;clear all;format long;
A = [3  1; 1 5]; 
b = [-1;1];
c = 0; 
N = 100; e_tol = 1e-8; x0 =zeros(length(b),1);

%x0 =[-0.1;-0.1]

x = linspace(-1,1,100); 
y = linspace(-1,1,100);
% 网格化、方便作图
[x, y] = meshgrid(x,y);
% 定义函数 f(x) = 0.5 * x' * A * x - x'*b + c
% 为了作图方便,如下定义
f=@(x,y) 0.5 * (A(1,1) * x.^2 + 2 * A(1,2) * x .* y + A(2,2) * y.^2) - (b(1) * x + b(2) * y) + c;
z = f(x,y);

mesh(x,y,z)
[x11,k1,r11] = Gradient_Descent(A,b,x0,e_tol,N);

figure(1)
mesh(x,y,z)
hold on
% 绘制最速下降法的每次迭代点
%scatter3(x11(1, :), x11(2, :), f(x11(1,:),x11(2,:)),'r','filled');
plot3(x11(1, :), x11(2, :), f(x11(1,:),x11(2,:)),'r-o');

xlabel('x');
ylabel('y');
zlabel('f(x, y)');
title('函数的三维表示');
hold off;

运行后得到

绘制等高线图

figure(2)
hold on 
contour(x,y,z,200)
plot(x11(1, :), x11(2, :), 'r-o');
title('最速下降法特点');
colorbar;

运行后得到


为了展示更清晰,将 $ x_0 $设为 [-0.2;0] ,可以得到这样的图像

由图形可以看出,最速下降法是如何下降的.

从某一点,选定最快的下降方向,下降到不能再下降为止,再重新找新的最快的下降方向.就这样依次进行下去.

由此可以看出最速下降法的优点是容易理解和实现较为简单.

当然也可以看出它还存在很大的改进空间,在每一次选方向时,明明有着更快更好的方向(三角形任意的第三边都更快).


以上图形均在北太天元软件中绘制,matlab同样可以正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据数据治理

大数据数据治理介绍 大数据数据治理是一个复杂的过程&#xff0c;涉及到数据的标准化、融通、关联、解析、聚合等一系列活动。其核心目标是在确保数据安全的基础上&#xff0c;提高大数据资源和资产的可用性、易用性和可靠性&#xff0c;从而显著提升大数据资源和资产的价值7。…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(四)

上一章节我们了解了 shuffle 相关的概念和原理后其实可以发现一个问题&#xff0c;那就是 shuffle 比较容易造成数据倾斜的情况。 例如上一节我们看到的图&#xff0c;在这批数据中&#xff0c;hello 这个单词的行占据了绝大部分&#xff0c;当我们执行 groupByKey 的时候触发了…

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…

孵化器补贴政策提问模板

对于一些需要创业的人来说&#xff0c;找场地是非常非常难的&#xff0c;一个好的场地能够提高创业的成功率&#xff0c;下面这些内容对于孵化器产业园的政策有一个好的提问&#xff0c;可以帮助你们了解这个孵化器合不合适。需要创业的人可以收藏 某孵化器政策示例 提问模板 …

Java进制转换

进制介绍 二进制&#xff1a;0B开头&#xff0c;0-1 八进制&#xff1a;0开头&#xff0c;0-7 十进制&#xff1a;0-9 十六进制&#xff1a;0x开头&#xff0c;0-9和A-F public class Binary{public static void main(String[] args){//二进制 10int n10B1010//十进制 1010int…

短视频动画脚本:成都鼎茂宏升文化传媒公司

短视频动画脚本&#xff1a;创作与魅力的探索 在数字化时代的浪潮中&#xff0c;短视频动画以其独特的魅力迅速崛起&#xff0c;成为大众娱乐和信息传播的重要载体。成都鼎茂宏升文化传媒公司作为一名原创文章编辑&#xff0c;我深入探索了短视频动画脚本的创作过程&#xff0…

揭秘GPU技术新趋势:从虚拟化到池化

从GPU虚拟化到池化 大模型兴起加剧GPU算力需求&#xff0c;企业面临GPU资源有限且利用率不高的挑战。为打破这一瓶颈&#xff0c;实现GPU算力资源均衡与国产化替代&#xff0c;GPU算力池化成为关键。本文深入探讨GPU设备虚拟化途径、共享方案及云原生实现&#xff0c;旨在优化资…

大模型学习资料整理:如何从0到1学习大模型,搭建个人或企业RAG系统,如何评估与优化(更新中...)

通过本文您可以了解到&#xff1a; 学习&#xff1a;从小白如何入手&#xff0c;从0到1开始学习大模型。RAG系统&#xff1a;我想搭建属于自己或者企业的RAG系统&#xff0c;我该怎么去做&#xff1f;评估&#xff1a;微调后的模型或者RAG系统&#xff0c;如何评估自己的模型和…

软件质量保障——三、四

三、黑盒测试 1.黑盒测试概述 1.1 如何理解黑盒测试&#xff1f; 1.2 黑盒测试有什么特点&#xff1f; 1.3 如何实施黑盒测试&#xff1f; 2. 黑盒测试用例设计和生成方法&#xff08;这里还是要自己找题做&#xff09; 2.1 等价类划分法 步骤&#xff1a; 1.选择划分准…

设置电脑定时关机

1.使用快捷键winR 打开运行界面 2.输入cmd &#xff0c;点击确认&#xff0c;打开命令行窗口&#xff0c;输入 shutdown -s -t 100&#xff0c;回车执行命令&#xff0c;自动关机设置成功 shutdown: 这是主命令&#xff0c;用于执行关闭或重启操作。-s: 这个参数用于指定执行关…

flask音乐交流平台-计算机毕业设计源码57105

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

kafka-生产者监听器(SpringBoot整合Kafka)

文章目录 1、生产者监听器1.1、创建生产者监听器1.2、发送消息测试1.3、使用Java代码创建主题分区副本1.4、application.yml配置----v1版1.5、屏蔽 kafka debug 日志 logback.xml1.6、引入spring-kafka依赖1.7、控制台日志 1、生产者监听器 1.1、创建生产者监听器 package co…

鸿蒙开发接口安全:【@ohos.abilityAccessCtrl (访问控制管理)】

访问控制管理 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import abilityAccessCtrl from ohos.abilityAccessCtrlabilityAccessCtrl.createAtManager createAtManager(): AtMan…

用户管理的小demo --登录:

目录 1、建库、建表 1.1 连接数据库后&#xff0c;在idea中 通过快捷方式 自动导入实体类 1.2 实体类代码 2、idea中的准备工作 2.1 在父工程下 新建子工程 2.2 在子工程下 添加webapp、pom.xml设置为 war的打包方式 2.3 在父工程下的pom.xml中 添加依赖 2.3.1 mysql的…

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机相互发送数据的RS485通信功能的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串…

力扣hot100学习记录(十一)

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 题意 两两交换链表中的相邻节点 思路 先创建一个…

机器学习知识点总结

简介&#xff1a;随着人工智能&#xff08;AI&#xff09;蓬勃发展&#xff0c;也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域&#xff0c;机器学习包含深度学习以及强化学习&#xff0c;在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

嘉之音:十年磨一剑 敢为天下先

一个产品创新 一个行业成长 一段人生价值 不断积累、沉淀、创新&#xff0c;终将实现其价值。 前十年&#xff0c;嘉之音经历了传统建材行业的变迁&#xff1b;声学聚酯自2010年初诞生&#xff0c;现在正在从第一个十年萌芽期进入高速成长黄金期。近年来&#xff0c;市场的不…

A6370超速保护监控器

A6370监控器是AMS 6300 SIS超速保护系统的一部分&#xff0c;并且 与A6371一起安装在19英寸机架中(84HP宽&#xff0c;3RU高) 系统底板。一个AMS 6300 SIS由三个保护监视器(A6370)组成 和一个背板(A6371)。 该系统设计用于涡流传感器、霍尔元件传感器和 磁性(VR)传感器。 传感器…

鸿蒙Ability Kit(程序框架服务)【UIExtensionAbility】

UIExtensionAbility 概述 [UIExtensionAbility]是UI类型的ExtensionAbility组件&#xff0c;需要与[UIExtensionComponent]一起配合使用&#xff0c;开发者可以在UIAbility的页面中通过UIExtensionComponent嵌入提供方应用的UIExtensionAbility提供的UI。UIExtensionAbility会…