news 2026/9/6 21:56:03

SWAT模型结构解析与软件工具链实战经验分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SWAT模型结构解析与软件工具链实战经验分享

简介:这是一份系统讲解SWAT模型结构与软件的PPT资料,面向水文水资源、环境科学领域的师生及科研人员,可用于快速理解半分布式水文模型的组成原理与工具链条。资源以单个PPT文件封装,大小3.13MB,内容精炼,便于对照学习。课件从模型用途与目标切入,梳理了SWAT的历史演变与核心特点,并详细拆解不饱和带、基流、壤中流、蒸散发等陆面水文过程;同时介绍SWAT程序包、操作界面及SWAT200X可执行程序的协作关系,补充了ArcSWAT、MWSWAT等界面工具和SWAT-CUP率定软件的用法。此外还给出ArcGIS环境下径流模拟的应用示例与软件安装指引。目前已有596人学习,适合作为SWAT入门或教学培训的辅助材料,便于快速建立模型结构—软件操作—应用案例的整体认知。 做SWAT模型也有几年了,从最早在ArcGIS里折腾ArcSWAT,到后面换成QSWAT、再切到SWAT+,踩过的坑累积起来快赶上模型参数表那么厚。很多新手拿到SWAT之后第一反应是“软件装好了怎么用”,但真正决定你能不能把模型跑通、跑出来敢不敢用的,是你对模型结构本身的理解,以及整个工具链怎么搭配。这篇文章不打算复读用户手册,就按我实际建模的经验,把这些年用过的SWAT模型结构概念和配套软件给你捋一遍。

1. SWAT模型的核心结构:从空间划分到水文过程拆解

1.1 半分布式与模块化:SWAT的设计逻辑

SWAT(Soil and Water Assessment Tool)本质上是一个物理基础的连续时间流域水文模型,但它不是那种把一个流域当成一个大水桶的集总式模型。SWAT采用半分布式思路:先把流域拆成若干子流域,每个子流域内部再按土地利用、土壤类型、坡度组合细分出水文响应单元(HRU),然后在水文响应单元上独立计算每个时段的水文过程,再通过河道和子流域汇流把水、沙、营养物一步步送到流域出口。

这种设计的最大好处是每个水文过程都能拆开看。降水落到地面之后,一部分被植被冠层截留,剩下的要么形成地表径流,要么下渗进入土壤;土壤水一部分被植物吸收蒸腾,一部分变成壤中流和浅层地下水,最后再通过基流补给河道。SWAT把这一整套过程模块化了:冠层截留、地表径流计算(默认用SCS曲线数法,也可以选Green-Ampt入渗)、蒸散发(有Penman-Monteith、Priestley-Taylor、Hargreaves三种方法可选)、土壤水垂向运移、浅层/深层含水层地下水过程、河道演算,以及泥沙、氮磷营养盐、农药、温度等水质模块。每个模块独立建模、参数相对独立,这意味着你在率定时可以分过程一点点校,而不是对着一个黑箱子瞎调。

1.2 子流域划分:由DEM到河网再到汇水区

子流域划分是所有空间分析的第一步,也是决定整个模型空间骨架的关键操作。SWAT通过DEM数字高程模型来提取水系:先填洼,再计算流向和汇流累积量,然后设定一个最小给水面积阈值。阈值直接决定河网密度——阈值越小,提取出来的河网越密、子流域个数越多,模型的空间细节度越高,但计算量和输入数据的准备成本也同步上升。

实际操作中我的经验是:阈值不要一刀切。如果是山区小流域,阈值可以取得小一些,比如100~500 ha;如果是几万平方公里的大流域,阈值取1000 ha以上会更合理。要记住,子流域划分的精细度要和你的数据分辨率匹配,DEM一般是30 m分辨率的SRTM或ASTER数据,你把阈值压到几十公顷,生成一堆只有一个HRU的“微型子流域”,不仅耗时不讨好,还很容易产生大量数值不稳定的小单元。划分完河网之后,要手动检查出口点位置,特别是平原区,DEM的河网很容易在中下游跑偏,必要时得配合已有的水系矢量数据做“burn in”,把河流强制烧进DEM里。

1.3 HRU:模型真正计算的最小单元

HRU全称Hydrologic Response Unit,这个概念几乎让所有SWAT初学者困惑。HRU不是空间上连续的一块地,它只是子流域内“土地利用-土壤-坡度”三类属性组合出来的一个面积百分比单元。比如某个子流域里,有30%的面积是“耕地+壤土+缓坡”,这30%就作为一个HRU参与计算。HRU彼此之间没有空间位置关系,模型默认它们均匀分布在子流域里,所有水文过程都按面积加权聚合到子流域出口。

这种设计的核心目的,是省掉栅格单元逐个模拟的巨大内存开销。如果你非要问“HRU和分布式网格相比谁更精确”,从物理真实性上讲网格当然更细致,但SWAT的定位是中长时段、大流域的水资源管理与非点源污染模拟,最关心的不是某个小斑块的精确水位,而是整个子流域乃至流域出口的水量水质响应。HRU牺牲了部分空间细节,换来了参数数量可控和计算效率的极大提升。

设定HRU阈值的时候也要有取舍。默认的阈值通常是10%(土地利用10%、土壤10%、坡度10%),意思是占比小于10%的类型会被重新合并到其他类型里。如果你把阈值改成0,模型会保留所有微小的土地类型组合,HRU数量爆炸式增长,而且很多HRU面积占比可能不到0.5%,对结果几乎没贡献,纯粹拉长运行时间。我自己的习惯是:先按默认阈值跑一遍,看看结果趋势是否合理,如果某个比例较大的类型被合并掉了再下调对应阈值。

2. 软件家族盘点:建模工具与率定工具怎么选

2.1 建模前端:ArcSWAT、QSWAT与SWAT+

SWAT模型不是“一个软件”,而是一套工具链。大部分用户接触到的建模前端主要有三条路线:ArcSWAT、QSWAT和SWAT+配套的QSWAT+/SWAT+ Editor。

ArcSWAT是历史最悠久、教程最多的方案,作为一个ArcGIS工具栏插件,界面直观,网上绝大部分中文教程都是基于它写的。但它的前提是你得有一套正版ArcGIS授权,而且ArcSWAT对ArcGIS版本要求非常严格,换版本经常碰到工具栏加载不出来的问题。QSWAT则是基于开源QGIS的插件版本,不需要ArcGIS授权,近几年用的人越来越多,界面逻辑和ArcSWAT基本一致,步骤也都是那三步:Watershed Delineation、HRU Analysis、Write Input Tables,熟悉一个就能很快适应另一个。

如果你是新项目新入手,我建议直接了解SWAT+。SWAT+不是简单的版本升级,而是底层结构的重构——原有的子流域与HRU结构被重新组织成更灵活的对象化结构(地形单元、景观单元、河道对象、水库/湿地/点源对象等),能支持的模拟场景比传统SWAT丰富得多,比如你可以更自由地配置多个源汇关系、湿地串联、农业管理措施。对应的软件是SWAT+ Editor,界面虽然不是特别符合传统直觉,但有自带的模型检查器,可以一键检查对象之间连接是否完整、参数文件是否缺失,这点比老版本友好太多。下表给你一个快速对比:

工具依托平台适用情况备注
ArcSWAT 2012ArcGIS 10.8/10.9传统SWAT建模,教程多需要ArcGIS授权,版本兼容需注意
QSWAT(传统版)QGIS 3.x传统SWAT建模,无需ArcGIS开源免费
QSWAT+ / SWAT+ EditorQGIS + SWAT+新版SWAT+/SWAT+建模数据结构更灵活,自带模型检查器
SWAT-CUP独立程序参数率定与不确定性分析SUFI-2用的人最多
SWAT Toolbox / 自研脚本Excel / R / Python批量处理结果与低精度率定适合批量和流程化

2.2 数据库与辅助工具:土壤库、天气发生器与模型检查器

很多人忽略一个事实:SWAT运行前必须准备好一系列数据库,而最耗时间的就是土壤数据库。ArcSWAT/QSWAT帮不了你建土壤库,它只负责把土壤空间数据映射到你提供的土壤属性表(usersoil)上。属性表里至少要有土层数、每层厚度、容重、有机碳含量、田间持水量、饱和导水率、黏粒/粉粒/砂粒含量等物理参数。一般国内用户可以借助HWSD(世界和谐土壤数据库)按土壤类型提取属性,再根据研究区实际情况修正。这块如果没配好,后面运行经常报“USLE_K”之类的错误。

天气发生器(WGN)也是建模中容易被忽视的一环。SWAT允许你输入逐日实测气象数据,但遇到缺测或者想生成多年连续情景时,就会调用天气发生器来自动补数据。生成器内置的统计参数(月平均气温、标准差、降水偏度、干湿日转移概率等)只能靠你手头的长序列气象数据统计出来。我第一次做的时候直接用了软件自带的美国站生成的参数,导致我国亚热带地区模拟的降雨日数奇奇怪怪,所以提醒一句:一定要用自己研究区的长序列数据去重新计算WGN。

至于模型检查器,SWAT+ Editor里已经集成了,主要用来检查模型要素之间的连接关系和数据文件完整性。老版本没有这么方便,只能靠你运行完以后人工翻日志。我第一次接触SWAT+的时候习惯性点了“Check Model”,提示了我好几个对象没有连接进水系,省了很大功夫。

2.3 率定与后处理:SWAT-CUP及脚本工作流

率定阶段最常用的软件是SWAT-CUP,它提供SUFI-2、GLUE、ParaSol、MCMC等好几个不确定性分析算法。其中SUFI-2是绝大多数人用的,原理不复杂:先给每个参数一个大范围,然后通过拉丁超立方抽样生成多组参数组合,批量跑模型,再用观测数据评估每组参数的拟合效果,根据结果迭代调整参数范围,直到大部分观测数据都落入95%预测区间。

SWAT-CUP本身的后处理能力比较一般,我经常把模拟结果重新导出来自己画图。如果你习惯用R或Python,可以写脚本批量读取output.rch和output.sub文件,用ggplot/matplotlib绘制径流过程线,也可以自己写简单的敏感性分析。工欲善其事,必先利其器,这句话在SWAT的后期工作上特别适用。

3. 建模实操全流程:一份能直接抄的清单

3.1 数据准备:DEM、土地利用、土壤、气象的硬性要求

SWAT模型跑通需要的最少数据是四件套:DEM、土地利用图、土壤图、气象数据。别小看准备阶段,我碰到的绝大多数模型异常都出在数据没处理好,而不是模型本身有问题。

DEM数据建议使用SRTM或ALOS的12.5 m/30 m产品。拿到以后第一件事是把坐标系统一到投影坐标系,比如UTM分区投影,绝对不要拿经纬度的GCS坐标直接开工,不然流域面积等会出现很大偏差。所有空间数据的坐标系、范围、栅格分辨率要一致,这是建模前必须确认的硬条件。土地利用数据需要重分类成SWAT的LUcode,比如耕地对应AGRL、牧草对应PAST、林地分FRSD/FRST、水域WATR等,一般需要一个重分类映射表来完成这一步。土壤数据最麻烦,不仅要空间分布图,还要一个完整的属性表,前面已经说过,HWSD是最容易上手的属性来源。

气象数据包含降水、最高/最低气温、相对湿度、风速、太阳辐射五个要素。如果实测辐射数据没有,SWAT可以靠软件自带的太阳辐射发生器补算。数据长度方面,我建议至少准备连续10年以上逐日数据,留出足够的预热期(spin-up)再划分率定期和验证期。你如果只拿3年数据,还想做3年率定3年验证,模型参数根本没机会收敛。

3.2 从流域划分到运行模拟的关键步骤

在ArcSWAT或QSWAT里,建模流程基本是三段式:Watershed Delineation、HRU Analysis、Write Input Tables。

第一步Watershed Delineation,加载DEM后先做预处理,接着设定生成河网的最小集水面积阈值,然后加载或者手动添加流域出口点,软件会自动生成子流域与河网拓扑关系。这一步生成的结果决定了你的模型有几个子流域,务必检查Outlet位置,平原地区很容易出现河道不顺畅的情况。

第二步HRU Analysis,依次加载土地利用栅格、土壤栅格,需要先定义Land Use重分类表和土壤类型查找表。接下来进入坡度分级,软件默认分5级,你可以自定义。最后设定HRU阈值。划分完成后,软件会生成每个子流域内各类土地利用、土壤和坡度的统计表格。我在这一步的习惯是:土地利用和土壤阈值保持10%,坡度阈值可以先设5%,如果后面发现某个类型的子流域面积占比异常再调整。

第三步Write Input Tables,这里要选择气象数据。你先要准备好站点地理位置表,以及降水、温度等逐日数据文件,并按SWAT要求的格式组织好。在“Weather Stations”界面里导入之后,软件会把这些外部数据写入模型输入表。这一步最容易出现的错误是日期格式不对或者数据中带了空值。写入完成后,你可以打开SWAT Editor,核对输入表的内容,设置模拟时间范围、步长和输出选择,然后就可以点Run SWAT运行了。

3.3 运行前检查:print设置、时间步长与错误日志

模型运行前有几个选项值得花几分钟确认:模拟起始与结束年份、时间步长(日/月/年),以及输出打印频次。很多人会把模拟年份设置成整个气象数据的长度,然后另外在输出里挑时间段做率定,这没问题,但要注意spin-up期。SWAT的土壤水、地下水初始状态是估计值,需要一段时间来达到稳定,所以真正用于率定的结果应该从模拟开始1到3年之后算起,或者把模拟开始时间往前推几年专门用来“预热”。

另外就是print code。在传统SWAT的.cio文件或SWAT Editor的output设置里,有各种“print”选项,比如是否输出HRU层面的详细信息、是否输出每日水质要素等。print设置越详细,生成的输出文件越大、越拖慢运行。我一般的策略是:模拟阶段先输出月尺度总量,确认水量平衡没大问题后,如果需要做日过程率定,再重新跑一次日输出。直接上来打开所有print开关,几百个子流域再加上几千个HRU,输出文件可能一下几十个GB,Numpy和Excel根本扛不住。

运行如果中断,大概率是输入文件有非法值,比如土壤数据库里有NaN、降水数据里出现负值或者气象文件的日期不连续。传统SWAT的报错很“Fortran味”,经常给你一个错误码,比如“ERROR: division by zero”或者“Error opening file”,对应的问题往往是某个HRU面积为零、某个参数没有被读取成功。SWAT+自带的模型检查器可以直接定位这类问题,老版SWAT只能靠人工排查。

4. 运行结果查看与模型率定

4.1 输出文件怎么看:output.rch / output.sub / output.hru

运行结束之后,很多新手以为直接在界面上就能看到精美的图,结果在项目文件夹里翻出一堆txt文件,直接懵了。实际上SWAT模拟完的结果都存在txtinout(或SWAT+的scenarios)目录下,核心输出文件就那么几个:output.rch记录每个河道断面的逐时段流量、泥沙、营养盐数据,output.sub记录每个子流域的汇总结果,output.hru记录每个HRU的产水产沙过程,另外还有output.rsv水库、output.ps点源等文件。

以output.rch为例,你打开文件会先看到一段说明行,接着是一行日期,下面才是数据。里面的列非常多,包括FLOW_IN、FLOW_OUT、EVAP、TLOSS、SED_IN、SED_OUT、ORGN_OUT、ORGP_OUT等,但你最常用的其实就是FLOW_OUT(河道出口流量)和SED_OUT(泥沙)。直接拿Excel打开也能看,但列太多容易看花眼,我建议用脚本处理。下面这段Python代码可以做一个基础读取:

import pandas as pd # output.rch 第一行是指南,具体列数取决于print code设置 f = open("output.rch") for _ in range(2): print(f.readline()) f.close() df = pd.read_csv( "output.rch", sep=r"\s+", skiprows=1, header=None, ) # 列数视情况而定,这里仅示意,建议先把文件头打印出来对一下 df.columns = [ "MON", "DAY", "YEAR", "AREA", "FLOW_IN", "FLOW_OUT", "EVAP", "TLOSS", "SED_IN", "SED_OUT", "SED_CONC", # 这里继续按实际列数补全 ] df["date"] = pd.to_datetime( dict(year=df["YEAR"], month=df["MON"], day=df["DAY"]) ) df = df.set_index("date")

需要特别提醒:不同版本SWAT的列数不完全一样,而且如果你改过print code,列也会变化。所以读数据前一定先打开文件看一眼前几行的文件头,别硬套别人脚本的列名。想直接快速查看的话,也可以用SWAT Editor或第三方工具(比如SWAT GUI的图形模块),但我个人觉得,把数据读出来画图最灵活、也最能发现模型异常。

4.2 率定前的参数准备:敏感性分析与参数范围

拿到第一版模拟结果,你要做的不是急着调参,而是先看整体水量平衡:长时间段平均径流量是不是比实测明显偏大或偏小。一般来说SWAT模拟径流偏小,常见原因是地表径流的CN2值偏小、土壤蒸发量被高估,或者河道下渗量过大。率定时的参数选择也要分过程:

  • 控制地表径流总量:CN2、SURLAG(地表径流滞后系数)、CANMX(冠层最大截留量)
  • 控制基流过程和枯季流量:ALPHA_BF(基流退水系数)、GW_DELAY(地下水滞后时间)、GWQMN(浅层地下水产生基流的阈值)
  • 控制蒸散发与土壤水:ESCO(土壤蒸发补偿系数)、SOL_AWC(土壤有效含水量)、SOL_K(饱和导水率)
  • 控制河道汇流:CH_K2(河道有效水力传导度)、CH_N2(河道曼宁糙率)

这些参数的物理含义要想清楚再动。比如ALPHA_BF越大,基流对降水的响应越慢、基流越平缓;ESCO越接近1,土壤蒸发越受限制、蒸散发总量可能下降;CH_K2如果调得特别大,河道里水被“漏”掉太多,下游流量会明显偏小。

在SWAT-CUP里,你首先要做敏感性分析,把上面这些参数全部丢进去(参数值给一个合理初值和范围,比如CN2相对变化±25%,ALPHA_BF绝对0到1,GW_DELAY 0到500,ESCO 0到1),跑一轮全局敏感性,看哪些参数对目标变量(通常是径流)影响最大。然后保留敏感参数,进入正式的自动率定环节。

4.3 SUFI-2自动率定的实操细节

SUFI-2是SWAT-CUP里默认且最常用的算法,流程大致是:选参数→设初始范围→抽样运行→计算目标函数→更新参数范围→迭代多轮。每一轮会产生几十到几百组参数组合,SWAT-CUP批量调用SWAT执行文件跑完以后,在结果里可以看到95PPU(参数不确定性95%预测区间)和观测值的覆盖率。

率定效果一般用NSE(纳什效率系数)、R²、PBIAS(百分比偏差)、KGE(Kling-Gupta Efficiency)来评价。月尺度径流率定,NSE达到0.65以上算不错,0.75以上算很好;日尺度要求更高,能到0.6已经可以接受;PBIAS越接近0越好,一般控制在±15%以内比较稳。如果NSE一直上不去,先别急着加大迭代次数,回头检查数据质量,往往比调参收获更大。

率定有一个非常常见的陷阱:参数被推到物理意义之外的值。比如CN2相对变化设到±25%,最后最优解是+24.99%,说明初始值设定本身有问题,或者率定目标跟水文过程不匹配。我不能说不允许,但这样做出来的模型没有可解释性,换一个降水情景就崩掉。另一个常见问题是率定期拟合很好、验证期一塌糊涂,这多半是过度拟合了率定期的高峰值。解决办法是:率定和验证各取一段有代表性的时期,可以一个含丰水年、一个含枯水年,并且优先保证水量平衡和月尺度趋势,再去抠日尺度尖峰。

5. 常见问题排查速查与个人经验

5.1 高频报错排查速查表

现象可能原因排查方法
模型运行中断,提示Error opening file路径包含中文/空格,或文件夹层级过深项目路径全部使用英文,最短路径原则
ArcSWAT/QSWAT点击工具没反应ArcGIS或QGIS版本与插件不匹配核对插件版本与GIS平台兼容性
模拟完成但没有输出文件模拟年份设置错误,或print code全关打开.cio文件检查simulation period
结果全部为0气象数据没接上,或HRU面积全为0检查Weather Stations数据和HRU统计表
蒸散发数值异常大/小天气发生器WGN参数不对重新统计本地气候参数
output.rch行数少得离谱时间步长设置成了年/月,而你想看日数据修改print code或output频率设置
河道流量下游比上游还大但子流域无支流河道演算参数CH_K2设置过大降低CH_K2,查看河段入流/出流
土壤数据库报USLE_K错误土壤属性表含NaN或取值范围异常检查有机碳、粒径含量数据

这些现象里有一大半我没少碰到过,尤其是路径含中文这个问题,我刚开始做项目时,模型在别人电脑上跑得好好的,换到我电脑上就闪退,后来才发现是我把项目放在“桌面-新建文件夹”这种路径下,中文字符+超长路径直接让Fortran编译的SWAT执行程序崩溃。换成纯英文路径后,世界一下就清净了。

5.2 我自己常用的几条建模心得

建模前先做一张数据清单表,把DEM、土地利用、土壤、气象的坐标系、分辨率、时间范围、来源都记清楚,避免做到一半才发现两个图层不重叠。

气象数据宁多勿漏,缺一个站的降水数据会导致该子流域模拟结果严重偏差。如果实在缺数据,可以通过距离加权插值补齐,但一定要在率定时重点检验缺测站所在子流域的模拟效果。

spin-up期真的不能省。SWAT初始土壤含水量的设定对前一两年的模拟影响非常大,尤其基流过程,头一年基本是“热车”状态。我一般会从数据起始时间往前推两到三年作为预热期,然后把率定期定在预热期之后。

自动率定不是万事大吉。SWAT-CUP跑了几百组参数之后,最优点可能落在了参数范围的边界上。这时我会手动回到SWAT Editor里,把这个参数调回一个物理上更合理的值,再跑一次看看目标函数变化幅度。如果损失不大,就用这个物理上说得通的参数。

最后再分享一个非常好用的习惯:每次率定结束后,把最优参数汇总成一张表,注释清楚参数名、最终值、敏感性排序、作用过程。下次做相邻流域或者类似尺度的研究,直接拿这个表当初始值,能少走一半弯路。SWAT模型的坑确实不少,但只要你把结构和软件工具链摸透,它依然是一个性价比极高、应用范围极广的流域模拟利器。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 21:52:48

最佳接收机原理与MATLAB仿真实现:匹配滤波、误码率及工程排坑指南

简介:这是一份通信工程课程设计报告,围绕匹配滤波器构建最佳接收机展开,从理论推导到仿真实现均有完整覆盖,适合通信工程专业学生、考研复试者以及从事数字接收机开发的初级工程师参考。资源以单个PDF文档形式提供,大小…

作者头像 李华
网站建设 2026/9/6 21:50:57

CDGA备考:用100道模拟真题吃透DMBOK数据管理知识体系

简介:面向数据治理工程师(CDGA)认证备考人群及数据治理从业者,这份模拟真题合集收录100道单选题并融合历年真题考点,覆盖数据治理角色与职责、数据生命周期、数据处理伦理、DAMA-DMBOK框架、GDPR准则、数据治理项目与活…

作者头像 李华
网站建设 2026/9/6 21:48:48

Wand-Enhancer 使用指南:免费解锁 WeMod Pro 的两种补丁模式

Wand-Enhancer 使用指南:免费解锁 WeMod Pro 的两种补丁模式 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer 是一款开源…

作者头像 李华
网站建设 2026/9/6 21:42:47

星巴克供应链深度拆解:从咖啡豆到门店的端到端体系

简介:星巴克物流与供应链管理分析报告是一份以星巴克为案例的供应链库存管理专题文档,适合物流管理、工商管理专业学生及企业供应链从业者用于课程设计、毕业论文参考或案例分析。内容覆盖供应链管理国家标准定义、星巴克库存管理作业流程与经济订购批量…

作者头像 李华
网站建设 2026/9/6 21:42:07

Task [N]: [Short descriptive title]

Task [N]: [Short descriptive title] 【免费下载链接】penpot Penpot: The open-source design platform for Product teams that need scalable collaboration. 项目地址: https://gitcode.com/GitHub_Trending/pe/penpot Description: One paragraph explaining what…

作者头像 李华