如和使用matlab进行求导 ,入门级教程

news2024/11/23 12:08:51

文章目录

  • 问题如图所示
  • 运行结果如图
  • 代码分析
  • 完整代码
  • 完结撒花

问题如图所示

在这里插入图片描述

运行结果如图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码分析

% 定义样本数量
n = 500;

这行代码定义了一个变量 n,它代表样本数量。这个变量在后面的代码中会被用到。

% 将 s 和 z 取值范围分成子区间的个数
num_intervals = 40;

这行代码定义了一个变量 num_intervals,它代表将 s 和 z 取值范围分成的子区间个数。这个变量在后面的代码中也会被用到。

% 将取值范围 [0,1] 和 [-1,1] 等分为 num_intervals+1 个子区间,存储在一维数组 s_values 和 z_values 中
s_values = linspace(0, 1, num_intervals + 1);

这行代码利用 linspace 函数将取值范围 [0, 1] 等分为 num_intervals+1 个子区间,并将每个子区间的左端点作为一个 num_intervals+1 长度的一维数组 s_values 中的元素。

% 将取值范围 [0,1] 和 [-1,1] 等分为 num_intervals+1 个子区间,存储在一维数组 s_values 和 z_values 中z_values = linspace(-1, 1, num_intervals + 1);

这行代码利用 linspace 函数将取值范围 [-1, 1] 等分为 num_intervals+1 个子区间,并将每个子区间的左端点作为一个 num_intervals+1 长度的一维数组 z_values 中的元素。

% 输出 s 和 z 的取值范围
fprintf('s ranges from %.2f to %.2f\n', s_values(1), s_values(end));
fprintf('z ranges from %.2f to %.2f\n', z_values(1), z_values(end));

这行代码分别输出了 sz 的取值范围,使用了 fprintf 函数对字符串进行格式化输出。

% 定义 r 和 g 函数
r = @(s) n / 4 * s;
g = @(z, s) 1.03 * (1 - exp(-1 * s)) * (1 + z.^2);

这两行代码定义了两个函数,分别为 rg。其中,r 是关于参数 s 的一次函数,g 是关于参数 zs 的一次函数。这里用到了匿名函数的语法。

% 定义 r 和 g 的一阶、二阶导数
r_prime = n / 4;
g_second = @(a, s, z) (1.03 * exp(-s) * (z.^2 - 1)) / ((1.03 * (1 - exp(-s)) + a).^3);

这两行代码定义了 rg 的一阶、二阶导数。r_prime 是一个常数,等于 n/4g_second 是一个与 sz 相关的函数,用了一个 lambda 表达式进行定义。

% 初始化 a_s_z 矩阵
a_s_z = zeros(num_intervals + 1);

这行代码初始化了一个 num_intervals+1 行、num_intervals+1 列的零矩阵 a_s_z,它将用来存储各个 sz 取值下求得的最小值点处的 a 值。

% 对每个区间端点使用梯度下降法计算最小值点处 a 的值for i = 1 : num_intervals + 1
    for j = 1 : num_intervals + 1
           % 计算在 a=0 时的 g''(n*a) 值
        g_second_0 = g_second(0, s_values(i), z_values(j));
        
        a = 0;
        
           % 进行梯度下降迭代,根据公式更新 a 直到收敛
        while true
            grad_s = r_prime * s_values(i) + g_second(a, s_values(i), z_values(j)) * (1.03 * exp(-s_values(i)) - a - 1.03);
            grad_z = 2 * z_values(j) * g_second(a, s_values(i), z_values(j));
            % 根据 i 和 j 的值判断更新 a 的方式
            if i == 1 && j == 1
                a = a - 0.0005 * grad_s;
            elseif i == 1
                a = a - 0.0005 * grad_z;
            elseif j == 1
                a = a - 0.0005 * grad_s;
            else
                a = a - 0.0005 * (grad_s + grad_z);
            end
            
              % 检查是否收敛
            if abs(g_second(a, s_values(i), z_values(j))) < 1e-10
                break
            end
        end
        
       % 将求得的 a 值存储到 a_s_z 矩阵中
        a_s_z(i, j) = a;
    end
end

这部分代码是最主要的部分,它使用了梯度下降法来求解每个子区间端点处对应的最小值点 a。具体来说,对于矩阵中的每个元素 a_s_z(i,j),首先计算在 a=0 时的 g''(n*a) 值,然后进行梯度下降迭代,根据公式更新 a 直到收敛(即 g''(n*a) 的绝对值小于一个很小的数)。在每次更新 a 时,需要分别计算在 s 方向和 z 方向上的梯度并进行更新,具体涉及到一些判断语句,因为对于矩阵中的每个边界点,梯度计算方式不同。最终,每个子区间端点处求得的 a 值都储存在 a_s_z 矩阵中。

% 使用 mesh 函数将 a_s_z 矩阵可视化为一个三维网格图
figure;
[X, Y] = meshgrid(s_values, z_values);
mesh(X, Y, a_s_z');
xlabel('s');
ylabel('z');
zlabel('a');
title('Mesh plot of a(s,z)');

这行代码使用 mesh 函数将 a_s_z 矩阵可视化为一个三维网格图。使用 meshgrid 函数生成一组坐标点 XY,然后将 a_s_z 矩阵的转置作为纵坐标值,传入 mesh 函数中即可。最后,添加坐标轴标签和图标题,完成可视化。

完整代码

% 定义样本数量
n = 500;

% 将 s 和 z 取值范围分成子区间的个数
num_intervals = 40;

% 将取值范围 [0,1] 和 [-1,1] 等分为 num_intervals+1 个子区间,存储在一维数组 s_values 和 z_values 中
s_values = linspace(0, 1, num_intervals + 1);
z_values = linspace(-1, 1, num_intervals + 1);

% 输出 s 和 z 的取值范围
fprintf('s 范围从 %.2f 到 %.2f\n', s_values(1), s_values(end));
fprintf('z 范围从 %.2f 到 %.2f\n', z_values(1), z_values(end));

% 定义 r 和 g 函数
r = @(s) n / 4 * s;
g = @(z, s) 1.03 * (1 - exp(-1 * s)) * (1 + z.^2);

% 定义 r 和 g 的一阶、二阶导数
r_prime = n / 4;
g_second = @(a, s, z) (1.03 * exp(-s) * (z.^2 - 1)) / ((1.03 * (1 - exp(-s)) + a).^3);

% 初始化 a_s_z 矩阵
a_s_z = zeros(num_intervals + 1);

% 对每个区间端点使用梯度下降法计算最小值点处 a 的值
for i = 1 : num_intervals + 1
    for j = 1 : num_intervals + 1
        % 计算在 a=0 时的 g''(n*a) 值
        g_second_0 = g_second(0, s_values(i), z_values(j));
        
        a = 0;
        
        % 进行梯度下降迭代,根据公式更新 a 直到收敛
        while true
            grad_s = r_prime * s_values(i) + g_second(a, s_values(i), z_values(j)) * (1.03 * exp(-s_values(i)) - a - 1.03);
            grad_z = 2 * z_values(j) * g_second(a, s_values(i), z_values(j));
            
            % 根据 i 和 j 的值判断更新 a 的方式
            if i == 1 && j == 1
                a = a - 0.0005 * grad_s;
            elseif i == 1
                a = a - 0.0005 * grad_z;
            elseif j == 1
                a = a - 0.0005 * grad_s;
            else
                a = a - 0.0005 * (grad_s + grad_z);
            end
            
            % 检查是否收敛
            if abs(g_second(a, s_values(i), z_values(j))) < 1e-10
                break
            end
        end
        
        % 将求得的 a 值存储到 a_s_z 矩阵中
        a_s_z(i, j) = a;
    end
end

% 使用 mesh 函数将 a_s_z 矩阵可视化为一个三维网格图
figure;
[X, Y] = meshgrid(s_values, z_values);
mesh(X, Y, a_s_z');
xlabel('s');
ylabel('z');
zlabel('a');
title('a(s,z) 的网格图');

完结撒花

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库迁移到ORACLE(持续更新)

1. 使用Oracle SQL Developer 官方 SQL Developer 23.1下载 选择Windows 64-bit with JDK 11 included安装 2.下载后解压&#xff0c;选择exe执行启动&#xff0c;启动后见图 3. 创建连接 默认支持创建Oracle连接&#xff08;见下图&#xff09;&#xff0c;第三方连接需导入…

企业微信自建应用 挂载网页步骤

打开企业微信网页端&#xff0c;并登录 企业微信 https://work.weixin.qq.com/wework_admin/frame#index 点击应用管理 再次点击 应用&#xff0c;划到自建版块&#xff0c;点击创建应用 依次添加应用信息 点击创建应用&#xff0c; 添加指定网页信息

【Android Studio】Flamingo版本 更新gradle插件(AGP) 7.+到8.+

步骤 build.gradle(module) android {namespace //adddefaultConfig {applicationId }}AndroidManifest.xml 取消package属性 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/andr…

如何设置imagedraw.draw.text的字体大小

如何设置imagedraw.draw.text的字体大小 解决方法 虽然绘制框是draw.text() 但是这个函数没有提供修改的参数 解决方法 其实在字体中已经设置了大小了&#xff0c;他是按照图像调整的&#xff0c;我就直接修改了。 参考文章

QTableWidget自定义单元格

一 自定义QTableWidget 创建一个Widget项目&#xff0c;注释掉其中的ui->setupUi(this);使用自定义的布局。 #include "widget.h" #include "ui_widget.h" #include <QTableWidget> #include <QTableWidgetItem> #include <QLineEdit&…

Vue.js中的provide和inject方法是什么,有什么区别

Vue.js中的provide和inject方法 在Vue.js中&#xff0c;provide和inject是用于父组件向子组件传递数据的一种技术。通过使用provide和inject&#xff0c;我们可以在组件树中任意层次的组件之间进行数据的传递和共享&#xff0c;从而实现复杂的数据交互和状态管理的需求。本文将…

FANUC机器人MODBUS TCP通信配置方法(示教器实物演示)

FANUC机器人MODBUS TCP通信配置方法(示教器实物演示) 机器人一侧的配置: 如下图所示,示教器上找到设置—主机通讯, 如下图所示,选择第一项TCP/IP,点击详细进入配置界面, 如下图所示,设置机器人端口1#的IP地址为192.168.1.10,子网掩码:255.255.255.0 如下图所示…

【深入理解Linux内核锁】一、内核锁的由来

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

Java Web——使用Filter实现用户登录

实验名称&#xff1a; 使用Filter实现用户登录 实验目的&#xff1a; &#xff08;1&#xff09;了解什么是Filter。 &#xff08;2&#xff09;熟悉Filter的拦截过程和接口中的方法。 &#xff08;3&#xff09;掌握第一个Filter程序的编写方法。 &#xff08;4&#xf…

华为荣获上海市技术发明一等奖!基于CANN的视频增强平台以AI技术修复历史视频

2023年5月26日&#xff0c;上海市科学技术奖励大会隆重召开&#xff0c;由上海交通大学牵头&#xff0c;中国科学院深圳先进技术研究院、咪咕视讯科技有限公司、华为技术有限公司、上海云视科技股份有限公司、上海人工智能创新中心、上海媒智科技有限公司、上海数字电视国家工程…

Oracle免费云设置Multi-factor Authentication

申请Oracle免费云账号的时候系统就强迫用户设置Multi-factor Authentication&#xff0c;我选择了OracleMobileAuthenticator作为2次认证工具。刚开始用还顺利&#xff0c;但用了一段时间后Oracle登录页面迟迟未向OracleMobileAuthenticator发送通知&#xff0c;要等非常久App才…

大模型 LLM 综述, A Survey of Large Language Models

大模型 LLM 综述, A Survey of Large Language Models 一、概述 一般认为NLP领域的大模型>10 Billion参数(也有人认为是6B、7B, 工业界用, 开始展现涌现能力); 经典大模型有GPT-3、BLOOM、Flan-T5、GPT-NeoX、OPT、GLM-130B、PaLM、LaMDA、LLaMA等; 大模型时间线, 图来自…

chatgpt赋能python:Python绘图教程:将画笔移动到绝对位置的方法

Python绘图教程&#xff1a;将画笔移动到绝对位置的方法 Python作为一门高级编程语言&#xff0c;设计初衷是让编程变得简单、易学、易用&#xff0c;且支持多种编程范式&#xff0c;其中产生了让人惊艳的绘图模块——Turtle&#xff08;海龟&#xff09;。 在这篇教程中&…

Mybatis-plus代码生成器

官网&#xff1a;MyBatis-Plus (baomidou.com) 顾名思义&#xff0c;就是它为你生成代码&#xff0c;这里可以为你生成Entity、Mapper、MapperXML、Service、controller等各个模块的代码&#xff0c;极大的提升开发效率 环境&#xff1a;mysql8.0.24、mybatis-plus3.5.3.1、spr…

<<Linux多线程服务端编程>>学习之栏1————线程安全的对象生命期管理

线程安全的对象生命期管理 此章节开头的前两句话&#xff0c;把我点醒&#xff0c;原来思考功力可以这么深厚&#xff01;如下&#xff1a; 第一句话&#xff1a; 编写线程安全的类不是难事&#xff0c; 用同步原语保护内部状态即可&#xff1b; 第二句话&#xff1a; 但是对…

【论文阅读】ControlNet

简介 目标&#xff1a;加入额外的条件&#xff08;例如边缘图像&#xff0c;深度图像&#xff09;控制生成的图像 现有挑战 特定领域上的数据较少&#xff0c;而预训练模型很大&#xff0c;很容易出现过拟合的情况。在资源有限的情况下&#xff0c;只能选择pretrain- finetun…

传统工业制造企业如何实现数字化转型?

传统工业制造企业如何实现数字化转型&#xff0c;以数字驱动、实现高价值管理&#xff1f; 传统企业实现数字化转型是一条很漫长但不得不走的道路&#xff0c;看到这个问题下有很多专业人士对传统企业如何做数字化转型都提出了专业的见解&#xff0c;所以这篇就以传统制造业为…

用ChatGPT来写高考作文,看看效果!

又是一年高考日&#xff0c;今天高考作文题目一出来&#xff0c;很多人第一时间就用AI进行写作&#xff0c;我这边也用gpt3和4分别生成了一篇文章&#xff0c;没有给他投喂范文&#xff0c;把要求和题目的prompt给它&#xff0c;让它分析和写作&#xff0c;来看看效果吧。 GPT4…

学习态度记录JRebel本地验证

学习态度记录JRebel本地验证 网上有两种方式。 1、直接使用其他同学提供好的远程服务器验证地址(可自行搜索) 2、设置本地反向代理&#xff0c;激活JRebel ps&#xff1a;我的IDEA升级到2023.1.2后无法使用第一种方式了。搜了半天网上都是基于windows环境的教程解说&#xff0…

html 原生js手写树 仿照antd 样式

效果如图 <!doctype html> <html><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…