地型重力積分作業

物理大地測量的作業,將地型切割成一塊塊長方體, 以 DEM 為基礎,用簡單的積分計算地型起伏、土壤中水份對重力的影響。

DEM

給定 DEM,格式為經度、緯度、E、N、正高, 其中 E N 的取樣間距分別是 92.47 92.68。

   120.9802780    24.7972221     0.0000000     0.0000000    44.013
   120.9811096    24.7972221    92.4697010     0.0000000    44.651
   120.9819412    24.7972221   184.9394020     0.0000000    45.191
   120.9827805    24.7972221   278.2653039     0.0000000    46.322

長方體積分

一塊長方體質量在垂直方向對相對位置 (x0,y0,z0) 處的重力加速度用積分計算為:

function Az=nt(tho,leng,width,thick,x0,y0,z0) %密度,長,寬,高,測站座標
    G=6.67E-11; % unit : MKS 制
    x(1)=width/2;
    x(2)=-x(1);
    y(1)=leng/2;
    y(2)=-y(1);
    z(2)=thick/2;
    z(1)=-z(2);

    for i=1:2
        xi(i)=x(i)-x0;
        et(i)=y(i)-y0;
        zt(i)=z(i)-z0;
    end

    f1=fz(xi(2),et(2),zt(2));
    f2=fz(xi(1),et(2),zt(2));
    f3=fz(xi(2),et(1),zt(2));
    f4=fz(xi(1),et(1),zt(2));
    f5=fz(xi(2),et(2),zt(1));
    f6=fz(xi(1),et(2),zt(1));
    f7=fz(xi(2),et(1),zt(1));
    f8=fz(xi(1),et(1),zt(1));

    Az=G*tho*(f1-f2-f3+f4-f5+f6+f7-f8);
end

function f=fz(xi,et,zt)
    s=sqrt(xi*xi+et*et+zt*zt);
    azt=abs(zt);
    f=xi*log(s+et)+et*log(s+xi)+2*azt*atan2(s+xi+et,azt);
end

積分地型

測站座標 (555.674, -185.362, 58.000) , 將 DEM 給定地型範圍看成一根根長方柱, 就能用上面長方體對一點質量的垂直重力加速度公式 計算 DEM 中各平面對該位置的垂直重力加速度貢獻。 在用上式積分時,座標原點視為在長方體中心, 所以以 DEM 一塊長方柱來說,就是在高度為一半處。

data = dlmread('tw_dem_1a.xyz');
%% neh = [north east height]
neh = data(:, 3:5);

station = [555.67441 -185.36194 58];


%% Q1
gravity_z = 0;

%% nt m kg
%% 2.67 g/cm^3 = 2670 kg/m^3
nt92 = @(thick, p) nt(2670, 92.4697010, 92.6809714, thick, p(1), p(2), p(3));

for i=1:rows(neh)
  %% 一個長方體 cell 的質心作為原點
  center = neh(i, :);
  thick = center(3);
  %% 長方體的質心在高度為一半處
  center(3) /= 2;
  gravity_z += nt92(thick, station - center);
end

%% gravity_z = 5.5722e-05 (m/s²)

土壤濕度

若加上土壤濕度的影響,假設土壤中水份的密度隨深度函數為 f(d) = 0.52-m*d/10 ,其中係數 m 在冬天為 1.3,夏天為 0.7, 且 f(d) 不會小於 0 則視為等於 0。 積分時因為不同深度時密度會不同, 所以我把一根長方柱在高度方向切為 64 份, 一塊塊視為內部密度相同的長方體,最後再加總。

%% Q2
water_density_winter = @(depth) (0.52 - 1.3*depth/10) * 1000;
water_density_summer = @(depth) (0.52 - 0.7*depth/10) * 1000;

function gravity = water_gravity(height, vector, season)
  count = 64;
  thick = height / count;
  gravity = 0;
  for i = 0:(count-1)
    height_i = i*thick + thick/2;
    depth_i = height - height_i;
    density_i = season(depth_i);
    if (density_i < 0)
      density_i = 0;
    end
    gravity += nt(density_i, 92.4697010, 92.6809714, thick,
                  vector(1), vector(2), vector(3)-height_i);
  end
end

gravity_z_summer = gravity_z;
gravity_z_winter = gravity_z;

for i=1:rows(neh)
  cell = neh(i, :);
  height = cell(3);
  cell(3) = 0;
  vector = station - cell;
  gravity_z_summer += water_gravity(height, vector, water_density_summer);
  gravity_z_winter += water_gravity(height, vector, water_density_winter);
end

%% [gravity_z_winter gravity_z_summer] = [5.6078e-05 5.6385e-05] (m/s²)

勘誤

nt.m

其中最後一行為 Az=G*tho*(f1-f2-f3+f4-f5+f6+f7+f8); , 但計算結果和 fortran 程式不同,結果上也和直覺相悖。 (密度加倍加速度不會加倍,距離增加加速度的變化異常。) 和 fortran 逐行比對後才發現最後一項應為 -f8 , 最後一行應為 Az=G*tho*(f1-f2-f3+f4-f5+f6+f7-f8);

土壤水份公式

題目中的土壤水份公式為 [water density] = -m * [depth] / 10 + 0.52 , 下文又說 m 在冬天為 -1.3 夏天為 -0.7 , 但依題意土壤水份應該越深越低, 所以題目可能多了一個負號,或是深度為負值。