基于HASM模型的土壤高精度建模matlab仿真

news2025/7/28 9:15:02

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

      土壤有机碳库是陆地生态系统中最丰富的碳库,其动态变化和存储分布在土壤质量评估、农田生态管理和气候变化适应与减缓等领域起着至关重要的作用。土壤有机碳储量的准确评估通常取决于土壤有机碳密度,其微小变化会显着影响大气中二氧化碳的浓度,从而进一步影响全球碳循环和生态平衡。因此对土壤有机碳密度进行精细预测对于更好的评估区域甚至全球土壤有机碳储量和理解生态系统碳循环至关重要。此外,土壤有机碳是景观中的三维实体,应更注意其垂直分布。其空间预测不仅应停留在表层,深层同样拥有大量的碳储量,且与评估总土壤有机碳储量相比,各层储量更为重要。表层土壤有机碳对地表径流、水分渗透、侵蚀控制和土壤耕作起着显著作用;而亚表层土壤碳动态比表层慢7倍。因此,更好地表述不同层土壤有机碳密度和储量的空间分布很有必要。此外,明确不同地表类型上土壤有机碳储量在不同土壤深度的差异,可以更好理解土壤有机碳的垂直分布,从而有助于理解深层碳如何转化为碳源或碳汇。

       基于数字化土壤制图,结合多种环境信息可实现土壤有机碳相关属性的三维制图。研究人员通常拟合土壤有机碳密度与土壤深度的函数以实现土壤有机碳密度和储量的三维预测;此外,结合土壤深度作为协变量的地统计一步法模型也得到了广泛应用。然而,现有的土壤有机碳储量估算方法存在以下缺陷。第一,对于函数拟合方法来说,各层独立建模忽略了不同深度之间的关系及其相互作用;第二,建模过程中,若将不同的环境协变量应用于不同的深度区间,会使模型解释更加困难;第三,并非所有采样点都随深度遵循同一衰减模式,且任一层的属性值都会影响总体拟合效果;第四,对于使用土壤深度作为协变量的三维建模方法,存在不确定性较大、精度较低、无法生成现实预测的问题。因此,建立充分利用土壤深度信息,并考虑各层之间的非线性关系以及地表分类信息的融合方法,有助于解决上述问题,进一步提高土壤有机碳储量估算精度。

       高精度曲面建模(highaccuracysurfacemodeling,hasm)方法是近年来发展起来的用于地理信息系统和生态建模的一种基于微分几何学曲面理论的曲面建模方法。

       HASM原始的模型,其差分迭代公式如下所示:

式中:

       上面的公式非常复杂,会导致计算量非常大,且运算速度慢,所以,我们在实际中,会简化这个HASM模型,下面重点介绍我们是如何简化这个模型的。

·首先简化第一类参数:

这里设hxi = hyi = h,那么上面的式子可以等效为:

 

·然后简化第二类参数:

上面的式子,同样道理,可以简化为:

 

 ·最后简化第三类参数:

上面的式子,同样道理,可以简化为:

 最后,我们得到的差分迭代公式为:

二、核心程序

clc;
clear;
close all;
warning off;


sel2       = 2;  %1: 全采样,2:1/4的采样率,3:1/9的采样率,4:1/16的采样率.........
Interation = 10;  %迭代次数
 
%调用数据文件
load datas.mat
%ncols         2268
%nrows         3105
%xllcorner     395510.20315996
%yllcorner     3279918.3520021
%cellsize      25
%NODATA_value  -9999
%将数据中的NAN转换为-9999,因为-9999表示的是非数据
%下面的代码是将你原始数据中的NAN类型的数据转换为非值数据-9999
[r,c] = size(data);
for i = 1:r
    for j = 1:c
        if isnan(data(i,j)) == 1
           data(i,j) = -9999;
        end
    end
end
%-9999不参与其中的运算,将其直接替换为0
for i = 1:r
    for j = 1:c
        if data(i,j) == -9999
           data(i,j) = 0;
        end
    end
end    
%由于原始的数据太大了,MATLAB会报错,内存不够,而且HASM的计算计算量非常巨大,所以需要降低原始数据的维度
%这个代码就是降维功能
data2 = func_samples(data,sel2);  

clear data;
data = data2;
[r,c] = size(data);
    
 
%利用HASM进行曲面建模,并进行迭代从而逼近最后的真实值
%分辨率
h     = 0.5;
alpha = 0.07;
%HASM建模结果变量
f = zeros(r,c,Interation);
%第一类基本变量
E = zeros(r,c);
F = zeros(r,c);
G = zeros(r,c);
%第二类基本变量
L = zeros(r,c);
N = zeros(r,c);
%第三类基本变量
T1_11 = zeros(r,c);
T1_22 = zeros(r,c);
T2_11 = zeros(r,c);
T2_22 = zeros(r,c);

%开始迭代循环
if  Interation > 15
    
    disp('There will be out of memory'); 
    break;
else    
    for n = 1:Interation
        disp('iteration ');
        n
        for i = 2:r-1
            for j = 2:c-1
                if n == 1
                   %以下就是HASM的迭代公式,具体的公式,将在设计说明中介绍
                   f(i,j,n) = data(i,j);

                   %第一类基本变量
                   E(i,j) = 1 + (( f(i,j+1,n) - f(i,j-1,n) )/( 2*h ))^2;
                   F(i,j) =     (( f(i,j+1,n) - f(i,j-1,n) )/( 2*h )) * (( f(i+1,j,n) - f(i-1,j,n) )/( 2*h ));
                   G(i,j) = 1 + (( f(i,j+1,n) - f(i,j-1,n) )/( 2*h ))^2;

                   %第二类基本变量
                   L(i,j) = ( f(i+1,j,n) - 2*f(i,j,n) + f(i-1,j,n) )/(sqrt( 1 +  (( f(i,j+1,n) - f(i,j-1,n) )/( 2*h ))^2  +  (( f(i+1,j,n) - f(i-1,j,n) )/( 2*h ))^2));
                   N(i,j) = ( f(i,j+1,n) - 2*f(i,j,n) + f(i,j-1,n) )/(sqrt( 1 +  (( f(i,j+1,n) - f(i,j-1,n) )/( 2*h ))^2  +  (( f(i+1,j,n) - f(i-1,j,n) )/( 2*h ))^2));

                   %第三类基本变量               
                   T1_11(i,j) = ( G(i,j) * ( E(i+1,j) - E(i-1,j) ) - 2*F(i,j)*( F(i+1,j) - F(i-1,j) ) + F(i,j)*( E(i,j+1) - E(i,j-1) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T2_11(i,j) =(2*E(i,j) * ( F(i+1,j) - F(i-1,j) ) -   E(i,j)*( E(i,j+1) - E(i,j-1) ) - F(i,j)*( E(i+1,j) - E(i-1,j) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T1_22(i,j) =(2*G(i,j) * ( F(i,j+1) - F(i,j-1) ) -   G(i,j)*( G(i+1,j) - G(i-1,j) ) - F(i,j)*( G(i,j+1) - G(i,j-1) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T2_22(i,j) =(  E(i,j) * ( G(i,j+1) - G(i,j-1) ) - 2*F(i,j)*( F(i,j+1) - F(i,j-1) ) + F(i,j)*( G(i+1,j) - G(i-1,j) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );

                end

                if n >= 2
                   %以下就是HASM的迭代公式,具体的公式,将在设计说明中介绍
                   %第一类基本变量
                   E(i,j) = 1 + (( f(i,j+1,n-1) - f(i,j-1,n-1) )/( 2*h ))^2;
                   F(i,j) =     (( f(i,j+1,n-1) - f(i,j-1,n-1) )/( 2*h )) * (( f(i+1,j,n-1) - f(i-1,j,n-1) )/( 2*h ));
                   G(i,j) = 1 + (( f(i,j+1,n-1) - f(i,j-1,n-1) )/( 2*h ))^2;

                   %第二类基本变量
                   L(i,j) = ( f(i+1,j,n-1) - 2*f(i,j,n-1) + f(i-1,j,n-1) )/(sqrt( 1 +  (( f(i,j+1,n-1) - f(i,j-1,n-1) )/( 2*h ))^2  +  (( f(i+1,j,n-1) - f(i-1,j,n-1) )/( 2*h ))^2));
                   N(i,j) = ( f(i,j+1,n-1) - 2*f(i,j,n-1) + f(i,j-1,n-1) )/(sqrt( 1 +  (( f(i,j+1,n-1) - f(i,j-1,n-1) )/( 2*h ))^2  +  (( f(i+1,j,n-1) - f(i-1,j,n-1) )/( 2*h ))^2));

                   %第三类基本变量               
                   T1_11(i,j) = ( G(i,j) * ( E(i+1,j) - E(i-1,j) ) - 2*F(i,j)*( F(i+1,j) - F(i-1,j) ) + F(i,j)*( E(i,j+1) - E(i,j-1) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T2_11(i,j) =(2*E(i,j) * ( F(i+1,j) - F(i-1,j) ) -   E(i,j)*( E(i,j+1) - E(i,j-1) ) - F(i,j)*( E(i+1,j) - E(i-1,j) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T1_22(i,j) =(2*G(i,j) * ( F(i,j+1) - F(i,j-1) ) -   G(i,j)*( G(i+1,j) - G(i-1,j) ) - F(i,j)*( G(i,j+1) - G(i,j-1) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );
                   T2_22(i,j) =(  E(i,j) * ( G(i,j+1) - G(i,j-1) ) - 2*F(i,j)*( F(i,j+1) - F(i,j-1) ) + F(i,j)*( G(i+1,j) - G(i-1,j) ) )/( 4*( E(i,j)*G(i,j) - F(i,j)^2 )*h );            

                   %差分方程的迭代
                   %TMP1 = f(i+1,j,n) - 2*f(i,j,n) + f(i-1,j,n)
                   TMP1(i,j)  = (h^2) * ( T1_11(i,j) * (f(i+1,j,n) - f(i-1,j,n))/(2*h) + T2_11(i,j) * (f(i,j+1,n) - f(i,j-1,n))/(2*h) + L(i,j)/(sqrt(E(i,j) + G(i,j) -1)) );
                   %删除异常点
                   if TMP1(i,j) > 8
                      TMP1(i,j) = 8;
                   end
                   if TMP1(i,j) < -6
                      TMP1(i,j) = -6;
                   end

                   %TMP2 = f(i,j+1,n) - 2*f(i,j,n) + f(i,j-1,n)
                   TMP2(i,j)  = (h^2) * ( T1_22(i,j) * (f(i+1,j,n) - f(i-1,j,n))/(2*h) + T2_22(i,j) * (f(i,j+1,n) - f(i,j-1,n))/(2*h) + N(i,j)/(sqrt(E(i,j) + G(i,j) -1)) ); 
                   %删除异常点
                   if TMP2(i,j) > 8
                      TMP2(i,j) = 8;
                   end              
                   if TMP2(i,j) < -6
                      TMP2(i,j) = -6;
                   end
                   %下面是上面的迭代结果,计算f(i,j,n)
                   %TMP1 = f(i+1,j,n) - 2*f(i,j,n) + f(i-1,j,n)
                   %TMP2 = f(i,j+1,n) - 2*f(i,j,n) + f(i,j-1,n)
                   f(i,j,n) = f(i,j,n-1) + alpha*(TMP1(i,j) - TMP2(i,j))/2;
                   
                end
            end
        end
    end
end
 

figure;
Fmin  = max(min(min(f(:,:,Interation))),0);
Fmax  = max(max(f(:,:,Interation)))/3;
clims = [Fmin,Fmax];
data3 = f(:,:,Interation);
imagesc(data3,clims);
title('HASM迭代后的结果');
axis square;

%保存最后的计算结果
save result.mat data3
 

%将数据保存到txt文件中
fid = fopen('savedat.txt','wt');
for i = 1:r
    for j = 1:c
        fprintf(fid,'%d  ',data3(i,j));     
    end
    fprintf(fid,'\n');     
end
fclose(fid);



三、测试结果

A16-16 

 

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

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

相关文章

Java实现图书管理系统

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaSE基础 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 今天给大家带来的是用Java实现的图书管理系统。 目录 需求 图书类 创建图书类 创建书架 Operation IOperation接口 添加图书AddOperation…

easyrecovery15最新版数据恢复类软件测评

当下如今&#xff0c;利用笔记本进行学习和办公已经是毋庸置疑的了&#xff0c;所以会需要在电脑上保存大量的数据信息&#xff0c;但是电脑在带来方便的同时&#xff0c;也存在很多的隐患。万一数据丢失了&#xff0c;该怎么办呢&#xff1f;要解决数据丢失问题&#xff0c;就…

VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout

Vue Grid Layout官方文档 Vue Grid Layout中文文档 1. npm下载拖拽缩放库 npm install vue-grid-layout3.0.0-beta1 --save 2. vue3 使用 vue-grid-layout报错&#xff1a;external_commonjs_vue_commonjs2_vue_root_Vue_default.a is not a constructor 解决方案: vue3版本…

力扣刷题(代码回忆录)——数组部分

数组 数组过于简单&#xff0c;但你该了解这些&#xff01;数组&#xff1a;二分查找数组&#xff1a;移除元素数组&#xff1a;序数组的平方数组&#xff1a;长度最小的子数组数组&#xff1a;螺旋矩阵II数组&#xff1a;总结篇704. 二分查找 给定一个 n 个元素有序的&#…

什么是MQ

MQ概述 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进 行通信。 分布式系统之间进行通信&#xff1a; 远程调用&#xff1a;各系统间直接通过远程调用的方式&#xff1b; 借助第三方完成系统…

【GlobalMapper精品教程】019:基于DSM提取离散随机点的高程信息

本文讲解在globalmapper中,基于DSM提取离散随机点的高程信息,配套数据为data019.rar。 文章目录 1. 离散点创建2. 提取离散点高程信息3. 高程标注1. 离散点创建 本文在ArcGIS中,根据给定的范围,随机生成离散点,如下图: 拓展阅读: ArcGIS根据范围创建随机点教程:【ArcG…

关于Kdo N3,1380099-68-2,3-脱氧-D-甘露-辛酸(Kdo)相关物理化学知识了解下

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;1380099-68-2 中文名&#xff1a;2-酮基-3-脱氧辛酸叠氮糖 英文名&#xff1a;Kdo Azide&#xff0c;Kdo N3 结构式&#xff08;Structural&#xff09;&#xff1a; 试剂基团反应特点&a…

基于51单片机的波形发生器proteus仿真数码管LCD12864显示

仿真图1简介&#xff1a; 本系统采用51单片机作为系统的MCU&#xff08;具体型号见下图&#xff09;&#xff0c;该系统显示器为四位数码管&#xff0c;可实时显示波形的参数情况 可显示四种波形&#xff0c;分别是方波、正弦波、三角波、锯齿波。 该设计具有电压表功能&#…

C语言MFC导出dll回调函数方法详解

如何将回调函数导出来 这一章节主要讲述在导出函数的基础上如何将回调函数导出来。 C程序设计语言&#xff08;第1-3部分&#xff09;&#xff08;原书第4版&#xff09; 京东自营优惠价&#xff1a;&#xffe5;119.1立即抢购 回调函数的应用相信很多C程序猿儿们都不陌生吧…

弘玑Cyclone2022年产品发布会:人人可用的数字化工作平台——弘玑工作易

近日&#xff0c;在弘玑Cyclone“智无边界&#xff0c;数字未来”发布会上&#xff0c;弘玑Cyclone2022年超级自动化系列产品全新亮相&#xff0c;首席产品官贾岿博士带领产品团队以创新技术对新时代语境下的数字生产力进行了全新解读。 本文将为大家分享本次发布会重磅推出的…

为什么要让员工入职流程实现自动化

人和人之间的第一印象非常重要&#xff0c;一段缘分能不能开始&#xff0c;就看第一印象够不够给力了。其实&#xff0c;公司和新员工之间也存在着这样的关系&#xff0c;但也有些许差别。公司对新员工的第一印象&#xff0c;更多是从第一次见面的时候就产生了&#xff0c;而新…

NodeJs实战-待办列表(4)-解决待办事项中文乱码问题

NodeJs实战-待办列表4-解决待办事项中文乱码问题乱码问题在哪里产生的定位乱码问题VSCode 启动 NodeJs 调试模式浏览器中调试JS效果图执行添加执行完成乱码问题在哪里产生的 运行第3节的server.js, 当添加中文待办事项时候&#xff0c;会产生中文乱码问题。乱码可能在以下地方…

一款超好用的开源密码管理器?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop 。 欢迎大家投稿&#xff0c;提交iss…

最新消息:2022高被引科学家名单已公布,都想成为高被引,到底应该怎么做?(附名单)

11月15日&#xff0c;科睿唯安发布了2022年“高被引科学家”名单。该名单旨在遴选全球自然科学和社会科学领域最具影响力的研究人员。入选“高被引科学家”名单&#xff0c;意味着该学者在其所研究领域具有世界级影响力&#xff0c;其科研成果为该领域发展作出了较大贡献。 全球…

百度全景数据采集与分析

1、百度街景是什么 全景是通过将平面数字图像转换为三维空间&#xff0c;从而带来拟真交互体验的地图浏览方式。 全景技术通过专业相机将现实世界的空间场景捕捉下来&#xff0c;利用软件将多幅平面照片拼接合成&#xff0c;并模拟成三维空间的360度全景景观。全景具有真实感强…

127. 单词接龙

127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&…

linux线程互斥锁

互斥量mutex 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。 但有时候&#xff0c;很多变量都需要在线程间共享&#xff0c;这样的变量…

基于粒子群优化算法的冷热电联供型综合能源系统运行优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

JAVA图书管理练习

目录0.前言1.书类(BOOK)1.1 Book1.2 BookList2. User类2.1 user类2.2 AdminUser类2.3 NormalUser类3.Operation类3.1 添加图书3.2 删除图书3.3 查找图书3.4 展示图书3.5 退出系统3.6 借阅图书3.7 归还图书0.前言 1.在学习了面向对象,接口继承等语法后,综合使用这些语法完成一个…

【第九章】vim 程序编辑器

文章目录vi与vimvi的使用范例按键说明一般指令模式可用的按钮说明&#xff1a;光标移动、复制贴上、搜寻取代等一般指令模式切换到编辑模式的可用的按钮说明一般指令模式切换到命令行界面的可用按钮说明vim的暂存盘、救援回复与打开时的警告讯息vi与vim 一、Linux上面的指令都…