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

news/2024/10/18 9:25:37/

文章目录

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

问题如图所示

在这里插入图片描述

运行结果如图

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

代码分析

% 定义样本数量
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 + 1for 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 truegrad_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 == 1a = a - 0.0005 * grad_s;elseif i == 1a = a - 0.0005 * grad_z;elseif j == 1a = a - 0.0005 * grad_s;elsea = a - 0.0005 * (grad_s + grad_z);end% 检查是否收敛if abs(g_second(a, s_values(i), z_values(j))) < 1e-10breakendend% 将求得的 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 + 1for 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 truegrad_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 == 1a = a - 0.0005 * grad_s;elseif i == 1a = a - 0.0005 * grad_z;elseif j == 1a = a - 0.0005 * grad_s;elsea = a - 0.0005 * (grad_s + grad_z);end% 检查是否收敛if abs(g_second(a, s_values(i), z_values(j))) < 1e-10breakendend% 将求得的 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.ppmy.cn/news/275133.html

相关文章

【每日一题Day230】LC1240铺瓷砖 | 暴力回溯

铺瓷砖【LC1240】 你是一位施工队的工长&#xff0c;根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m&#xff0c;为保持极简的风格&#xff0c;需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的规格不限&#xff0c;边长都是…

儿童睡眠慢波的起源、同步和传播

摘要 目的&#xff1a;使用EEG delta功率(&#xff1c;4Hz)测量的睡眠慢波活动在整个发育过程中发生显著变化&#xff0c;反映了大脑功能和解剖结构的变化。然而&#xff0c;个体慢波特征随年龄的变化尚未被彻底研究。在这里&#xff0c;本研究旨在表征儿童期到成年期的个体慢…

Elasticsearch8.6.0安装

Elasticsearch 8.5.0 安装 Elasticsearch 简介Elasticsearch 8.6.0 安装创建网络拉取镜像运行镜像设置密码修改kibana配置绑定ES代码绑定&#xff1a;手动绑定&#xff1a; 配置ik分词器扩展词词典停用词词典 Elasticsearch 简介 Elasticsearch&#xff08;ES&#xff09; 是一…

独立产品灵感周刊 DecoHack #041 - 那些独立开发者是怎么养活自己的

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. SOCCER STREAM…

Java 进阶 -- 集合(四)

5、算法 这里描述的多态算法&#xff08;polymorphic algorithms&#xff09;是Java平台提供的可重用功能。它们都来自Collections类&#xff0c;并且都采用静态方法的形式&#xff0c;其第一个参数是要对其执行操作的集合。Java平台提供的绝大多数算法都在List实例上操作&…

分享回顾|新岁序开,2023 和Jina AI共同码梦!

在坚持开放协作精神、具备全球影响力的 Jina AI 开源社区&#xff0c;每天都有来自世界各地的开发者来到这里&#xff0c;因为技术产生联结&#xff0c;因为联结产生共创。一直以来&#xff0c;我们都为拥有这样一个全球化、多元化和高速发展的社区而感到自豪和感激&#xff01…

经典ps教程600例 打造ps高手

经典ps教程600例 打造ps高手Photoshop CS魔术&#xff0c;制作神秘魔眼Photoshop教程&#xff1a;制作熊熊的火焰在燃烧Photoshop教程活用通道Photoshop换头术巧妙修改闭眼照片Photoshop爆破特效另类做法Photoshop广告特效之神奇的人体穿孔标志设计中的字体处理艺术Photoshop处…

[经典收藏]1200个Photoshop经典实例打造ps高手!

通道抠图之终极手腕 漂亮女人与颜色的唯美设计 Photoshop精彩文字特效:长根的树形字 AI结合PS制作:晚风中的芦苇丛 Photoshop图层遮罩做简单平面设计效果 Photoshop制作环形文字 Photoshop高手绘制的一只蝉