趋势面模型分析实例(python)

python 趋势面模型分析实例

已知五个气象站,这五个站围绕着未知的0号站。下图为各个站点的x、y坐标及及其已知值

第一行为0号点x,y坐标 z值未知暂设为0
而后依次为1,2,3,4,5号点xyz值

 对未知点0进行插值。最小二乘法通常用于计算方程:
在这里插入图片描述
中的待定系数b0,b1,b2。因此。第一步是建立如下三个正规方程:
在这里插入图片描述
以上方程改写成如下矩阵:

将左边第一个逆矩阵与右边的矩阵相乘,计算出系数b
而后利用公式:

在这里插入图片描述
从而求出未知值

具体代码如下:

import numpy as np
from numpy.linalg import *
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
data=np.loadtxt(open('站点坐标.csv'),delimiter=",",skiprows=0)  #读取坐标
print('\n站点坐标:\n',data)
x=data[1:,0]  #提取x第一列
y=data[1:,1]  #提取y第二列
z=data[1:,2]  #提取z第二列

sx=sum(x);sy=sum(y);sz=sum(z)
sxy=sum(x*y);sxx=sum(x*x);syy=sum(y*y)
sxz=sum(x*z);syz=sum(y*z)
p1=[len(x),sx,sy,sx,sxx,sxy,sy,sxy,syy]
p2=[sz,sxz,syz]
p1=np.array(p1).reshape(3,3)
p2=np.array(p2).reshape(3,1)
b=np.dot(inv(p1),p2)
z0=b[0]+b[1]*data[0,0]+b[2]*data[0,1]
print('\n0号点未知值计算结果:\n',z0)
data[0,2]=z0

#站点三维坐标图   0号点高程未知,暂设为0
x=data[:,0]  #提取x第一列
y=data[:,1]  #提取y第二列
z=data[:,2]  #提取z第二列
ax= plt.figure().add_subplot(111,projection='3d')
ax.scatter(x,y,z,c='b',marker='D')


ax.set_title('0号站点及周围站点三维坐标图',fontsize=12,color='teal')
for i in range(0,len(x)):     #添加点标签
    ax.text(x[i],y[i],z[i],i)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

#画图结束

运行结果如下:

 

 

上述示例为简单模型,大多数自然现象的分布通常比由一阶趋势面生成的倾斜更复杂。因而,需要更高阶的趋势面模型来拟合更复杂的表面。

参考文献:

[1] (美)张康聪 著;陈健飞等译. 地理信息系统导论(第三版). 北京:清华大学出版社, 2009.04[2]     http://t.csdn.cn/qgJ8N

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
趋势面法插值是一种用于通过建模数据中的趋势来进行插值的方法。在Python中,可以使用numpy和matplotlib库来实现趋势面法插值。 以下是一个示例代码,展示了如何使用泛克里金法进行趋势面法插值: ```python import numpy as np from scipy.interpolate import Rbf import matplotlib.pyplot as plt # 生成示例数据 x = np.random.rand(100) * 10 y = np.random.rand(100) * 10 z = np.sin(x) + np.cos(y) # 创建网格点 xi, yi = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 100)) # 使用泛克里金法进行插值 rbf = Rbf(x, y, z) zi = rbf(xi, yi) # 绘制插值结果 plt.contourf(xi, yi, zi, levels=100, cmap='jet') plt.scatter(x, y, c=z, cmap='jet') plt.colorbar() plt.xlabel('X') plt.ylabel('Y') plt.title('趋势面法插值结果') plt.show() ``` 上述代码首先生成了一组示例数据,然后创建了一个网格点用于插值。接下来,使用Rbf函数对示例数据进行插值计算得到插值结果。最后,使用contourf函数绘制了插值结果的等值线图,并使用scatter函数绘制了原始数据点。 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体数据和需求进行适当的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [趋势模型分析实例python)](https://blog.csdn.net/weixin_64338372/article/details/129816560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [空间插值——克里金插值](https://blog.csdn.net/weixin_39991055/article/details/111800632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值