MATLAB非均匀网格梯度计算

在matlab中,gradient函数可以很方便的对均匀网格进行梯度计算,但是对于非均匀网格,但是gradient却无法求解非均匀网格的梯度,这一点我之前犯过错误。我之前以为在gradient函数中指定x,y等坐标,其求解的就是非均匀网格梯度了,然而并不是。
在这里插入图片描述
于是,今天下午开始写非均匀网格求梯度的函数。
首先,函数的要求为:
1、边界处采用二阶偏心差分
2、内部网格点采用二阶中心差分
3、计算三维矩阵的梯度

明确目标之后,我们首先进行理论推导:

理论推导

1、内部网格点

在这里插入图片描述
对a1和a3两点分别进行泰勒展开,公式如下:
a 3 = a 2 + a ˙ 2 Δ x 2 + 1 2 a ¨ 2 Δ x 2 2 + O ( Δ x 2 3 ) 1 ◯ a 1 = a 2 − a ˙ 2 Δ x 1 + 1 2 a ¨ 2 Δ x 1 2 + O ( Δ x 1 3 ) 2 ◯ a_{3}=a_{2}+\dot{a}_{2}\Delta x_{2}+\frac{1}{2}\ddot{a}_{2}\Delta x_{2}^{2}+O(\Delta x_{2}^{3})\textcircled{1} \\a_{1}=a_{2}-\dot{a}_{2}\Delta x_{1}+\frac{1}{2}\ddot{a}_{2}\Delta x_{1}^{2}+O(\Delta x_{1}^{3})\textcircled{2} a3=a2+a˙2Δx2+21a¨2Δx22+O(Δx23)1a1=a2a˙2Δx1+21a¨2Δx12+O(Δx13)2

在这里插入图片描述
最终得到
在这里插入图片描述

2、边界点

在这里插入图片描述

理论部分结束,下面进入代码部分

代码部分

首先,我写了一个1D的函数

function dydx = calc_grad_1D(x,y)
%% 求解一维数组的梯度
%% input1:一维函数坐标-->x
%% input2:一维函数值-->y
dydx = zeros(1,length(x));
for i = 1:length(x)if i>1 && i<length(x)deltax1 = x(i)-x(i-1);deltax2 = x(i+1)-x(i);son = (y(i+1)*deltax1^2-y(i-1)*deltax2^2-y(i)*(deltax1^2-deltax2^2));mom = (deltax2*deltax1^2+deltax1*deltax2^2);dydx(i) = son/mom;elseif i==1n = (x(3)-x(1))/(x(2)-x(1));son = y(i+2)-y(i+1)*n^2-(1-n^2)*y(i);mom = (n-n^2)*(x(i+1)-x(i));dydx(i)=son/mom;elseif i==length(x)n = (x(i)-x(i-2))/(x(i)-x(i-1));son = y(i-2)-y(i-1)*n^2-(1-n^2)*y(i);mom = (n-n^2)*(x(i)-x(i-1));dydx(i)=-son/mom;end
end
end

接下来验证该函数的准确性

x = [1 2 4 7 10];
y = x.^2;
%%
dydx = calc_grad_1D(x,y);
%%
dydx_ana = 2.*x;
plot(x,dydx_ana,'-*')
hold on
plot(x,dydx,'-o')
xlabel('x');ylabel('dydx')
legend('理论值','数值解')

在这里插入图片描述
接下来我们进行3D矩阵的梯度求解,思想是调用上述的1D求解函数。
代码如下:

function [dfdx,dfdy,dfdz] = calc_grad_3D(F,X,Y,Z)
%UNTITLED26 此处提供此函数的摘要
%   此处提供详细说明
nx = size(X,1);ny = size(Y,2);nz = size(Z,3);
dfdx = zeros(nx,ny,nz);dfdy = zeros(nx,ny,nz);dfdz = zeros(nx,ny,nz);
for j = 1:nyfor k = 1:nzdfdx(:,j,k) = calc_grad_1D(X(:,j,k),F(:,j,k));end
end
for i = 1:nxfor k = 1:nzdfdy(i,:,k) = calc_grad_1D(Y(i,:,k),F(i,:,k));end
end
for i = 1:nxfor j = 1:nydfdz(i,j,:) = calc_grad_1D(Z(i,j,:),F(i,j,:));end
end
end

具体案例是求解函数 F = x 2 + y 2 + z 2 F=x^2+y^2+z^2 F=x2+y2+z2在三个方向的梯度

clc;clear
x = 1:10;y = x;z = x;
[X,Y,Z] = ndgrid(x,y,z);
F = X.^3+Y.^2+Z.^3;
%%
[dFdy,dFdx,dFdz] = gradient(F,Y(1,:,1),X(:,1,1),Z(1,1,:));
%%
[dfdx,dfdy,dfdz] = calc_grad_3D(F,X,Y,Z);
%% 理论解与数值解对比
dfdy_ana = 2.*(Y);
dfdy_ana = reshape(dfdy_ana,1000,1);
dfdy = reshape(dfdy,1000,1);
dFdy = reshape(dFdy,1000,1);
c = abs(dfdy-dfdy_ana);
d = abs(dFdy-dfdy_ana);
plot(c,'-o')
hold on
plot(d,'-o')
%% 绘图设置
axis([0 1000 0 2])
legend('My code','MATLAB gradient')
ylabel('误差')

结果如下:
在这里插入图片描述可以看出,matlab里的gradient函数由于在边界上采用一阶差分,因此存在误差,而我们的函数内部点和边界点都采用二阶精度,因此误差为0。

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

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

相关文章

Metasploit 溢出 samba 提权漏洞

一、信息收集 1.1 右键单击桌面&#xff0c;选择 Open Terminal Here &#xff0c;打开终端。 1.2 输入命令 nmap -sS -p 139,445 -A 192.168.1.254 ,对目标主机进行扫描,发现 139、445 端口开放。 1.3 输入命令“msfconsole”&#xff0c;启动 MSF 终端。 1.4 输入命令“searc…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频&#xff0c;用来制作教学教程。不过&#xff0c;每次录制都要通过菜单或搜索来打开录屏软件&#xff0c;实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀&#xff1f;或者有没有通用的快捷键设置方法&#xff1f;” 在当今数字时…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

MySQL中脏读与幻读

一般对于我们的业务系统去访问数据库而言&#xff0c;它往往是多个线程并发执行多个事务的&#xff0c;对于数据库而言&#xff0c;它会有多个事务同时执行&#xff0c;可能这多个事务还会同时更新和查询同一条数据&#xff0c;所以这里会有一些问题需要数据库来解决 我们来看…

centos 7使用源码编译安装Python 3.12.2(最新版本)

&#xff08;一&#xff09;、说明 在centos 7上&#xff0c;默认安装出来的python是&#xff1a;2.7.5版本 1.查看python版本&#xff1a; python --version 2.通过yum安装出来的&#xff0c;适合当前操作系统的&#xff0c;最新的python版本是&#xff1a;3.6.8 python3…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

【Linux系统化学习】死锁 | 线程同步

目录 死锁 死锁的必要条件 避免死锁 线程同步 条件变量 同步概念和竞态条件 条件变量接口 创建和初始化条件变量 等待条件满足 唤醒等待 毁条件变量 为什么 pthread_cond_wait 需要互斥量? 条件变量使用规范 等待条件代码 给条件发送信号代码 死锁 死锁是指在一…

扭蛋机小程序带来了什么优势?扭蛋机收益攻略

在当下的潮流消费时代&#xff0c;人们对潮玩也日益个性化&#xff0c;扭蛋机作为一种新型的娱乐消费模式&#xff0c;深受大众喜爱。扭蛋机的价格低&#xff0c;各个年龄层的玩家都可以进行购买&#xff0c;潜在玩家量非常大。扭蛋机商品主打热门IP周边等&#xff0c;种类繁多…

【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录 一、技术背景1.1 背景1.2 什么是 DBLink 二、安装配置 DBLink2.1 安装 DBLink2.2 配置 DBLink1. 修改 postgresql.conf2. 修改 pg_hba.conf 三、DBLink 使用3.1 数据准备3.2 DBLink 使用1. 创建 DBLink 连接2. 使用 DBLink 进行查询3. 使用 DBLink 进行增删改4. 使用 DBLi…

python代码实现kmeans对鸢尾花聚类

导入第三方库和模型 from sklearn import datasets import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans2、创建画图函数 def draw_result(train_x, labels, cents, title):n_clusters np.unique(labels).shape[0]#获取类别个数color …

用vue3实现留言板功能

效果图&#xff1a; 代码&#xff1a; <script setup lang"ts"> import { ref } from vue;interface Message {name: string;phone: string;message: string; }const name ref<string>(); const phone ref<string>(); const message ref<st…

Llama 3 安装使用方法

Llama3简介&#xff1a; llama3是一种自回归语言模型&#xff0c;采用了transformer架构&#xff0c;目前开源了8b和70b参数的预训练和指令微调模型&#xff0c;400b正在训练中&#xff0c;性能非常强悍&#xff0c;并且在15万亿个标记的公开数据进行了预训练&#xff0c;比ll…

python——井字棋游戏——登入注册界面

本篇文章只讲解登入和注册页面&#xff0c;在后面的文章中会讲解井字棋游戏&#xff0c;然后把井字棋和登入界面进行连接&#xff0c;整合成一个完整的游戏。 登入注册界面在本篇文章的末尾。 1.实现登入界面 &#xff08;1&#xff09;导入图片 把这张图片存储在与代码路径…

Rundeck(四)安全配置

自动化运维工具rundeck GitHub - rundeck 是java开发的开源自动化服务&#xff0c;具有 Web 控制台、命令行工具和 WebAPI。它使您可以轻松地跨一组节点运行自动化任务&#xff0c;适合运维自动化管理、自动发布管理、运维数据分析等 网站&#xff1a;https://www.rundeck.co…

人人开源框架运行

Getting started renrenio/renren-fast-vue Wiki GitHub 人人开源 1.启动navicat&#xff1a;新建一个数据库renren-fast&#xff0c;字符集为utf-8,utf-8mb3或者utf-8mb4&#xff0c;排序规则不选 2.数据库操作在renren-fast数据库中选择表&#xff0c;运行renren-fast-ma…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…

web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

卷积注意力模块 CBAM | CBAM: Convolutional Block Attention Module

论文名称&#xff1a;《CBAM: Convolutional Block Attention Module》 论文地址&#xff1a;https://arxiv.org/pdf/1807.06521.pdf 我们提出了卷积块注意力模块&#xff08;CBAM&#xff09;&#xff0c;这是一种简单但有效的前馈卷积神经网络注意力模块。给定一个中间特征图…

transformer上手(10)—— 文本摘要任务

文本摘要是一个 Seq2Seq 任务&#xff0c;尽可能保留文本语义的情况下将长文本压缩为短文本。 文本摘要可以看作是将长文本“翻译”为捕获关键信息的短文本&#xff0c;因此大部分文本摘要模型同样采用 Encoder-Decoder 框架。当然&#xff0c;也有一些非 Encoder-Decoder 框架…

prompt提示词:AI英语词典,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 英语词典提问技巧效果图&#xff1a;提示词&#xff1a; 英语词典提问技巧 随着AI工具的出现&#xff0c;学英语也可以变得很简单&#xff0c;大家可以直接通过AI 来帮助自己&#xff0c;提高记忆单词的效率&#xff0c;都可以不需要网易有道词典了&#xff0c;今天我教大…