零、相关简介
数学建模在解决实际问题中发挥着重要作用,2015年A题“太阳影子定位”便是一个典型的应用案例。本题主要研究的是如何根据太阳的位置和物体的影子来确定物体的空间位置。
在现实世界中,确定一个物体的确切位置是许多领域如导航、考古、建筑和地理信息系统中的关键问题。传统的全球定位系统在某些环境下可能不可靠或不可用,而利用太阳影子定位则提供了一个有趣的替代方案。该方法基于日影测量法,这是一种古老的技术,通过观察太阳的位置和物体产生的影子来推断物体的位置。
首先,理解太阳的运动对解决这一问题至关重要。太阳在天空中的运动呈现出一定的规律性,按照一定的纬度和日期,太阳的高度角和方位角在一天中的变化是可以预测的。这些角度信息直接影响着物体影子的方向和长度。因此,在建模时首先要建立一个关于太阳运动模型,这通常涉及到天文学的基础知识,如太阳的赤纬、时角等概念。
接下来,建立一个影子生成模型。当太阳光照射到物体时,根据物体的形状和太阳光的入射角,会在与光源相反的方向产生影子。这个模型需要考虑到物体的形状和尺寸,因为这些因素会影响影子的形状和长度。在此步骤中,几何知识被广泛应用于模拟影子的形成。
确定了太阳的位置和影子后,接下来的步骤是通过建立数学模型来解决实际的定位问题。这通常涉及到一系列的几何计算和代数方程。例如,可以通过建立光线与物体相交的方程来确定影子的起点,通过分析影子的方向和长度,可以得出物体相对于光源的位置。
然而,仅凭影子信息通常不足以唯一确定一个物体在三维空间中的位置,因为不同位置的物体在特定时刻可能产生相似的影子。因此,通常需要一系列时间点上的影子数据,或者结合其他信息,如物体的高度、周围环境等,来辅助定位。
在解决问题的过程中,数学建模扮演了中心角色。它不仅要求参与者具备较强的数学和物理知识,还需要能够将理论知识应用于解决实际问题。此外,计算机编程能力也非常重要,因为往往需要编写程序来进行复杂的计算和模拟。
综上所述,太阳影子定位问题是一个多学科交叉的问题,它不仅涉及到数学、物理学和天文学知识,还要求能够有效地利用计算机工具。通过数学建模方法解决这一问题,不仅能够增强理论与实践的结合,还能够促进学生综合运用所学知识解决复杂问题的能力。这种以问题为导向的学习方式,对于培养学生的创新思维和实际操作能力具有重要意义。
一、题目回顾(第二问为例)
题:
根据某固定直杆在水平地面上的太阳影子顶点坐标数据,建立数学模型确定直杆所处的地点。将你们的模型应用于附件1的影子顶点坐标数据,给出若干个可能的地点。
二、题目数据:
北京时间 | x坐标(米) | y坐标(米) |
---|---|---|
14:42 | 1.0365 | 0.4973 |
14:45 | 1.0699 | 0.5029 |
14:48 | 1.1038 | 0.5085 |
14:51 | 1.1383 | 0.5142 |
14:54 | 1.1732 | 0.5198 |
14:57 | 1.2087 | 0.5255 |
15:00 | 1.2448 | 0.5311 |
15:03 | 1.2815 | 0.5368 |
15:06 | 1.3189 | 0.5426 |
15:09 | 1.3568 | 0.5483 |
15:12 | 1.3955 | 0.5541 |
15:15 | 1.4349 | 0.5598 |
15:18 | 1.4751 | 0.5657 |
15:21 | 1.516 | 0.5715 |
15:24 | 1.5577 | 0.5774 |
15:27 | 1.6003 | 0.5833 |
15:30 | 1.6438 | 0.5892 |
15:33 | 1.6882 | 0.5952 |
15:36 | 1.7337 | 0.6013 |
15:39 | 1.7801 | 0.6074 |
15:42 | 1.8277 | 0.6135 |
三、问题分析
由附件数据可知,真实的影长
L
′
=
x
2
+
y
2
L' = \sqrt{x^2 + y^2}
L′=x2+y2
得到时间影长列表:
北京时间 | 影长 |
---|---|
14:42 | 1.1496 |
14:45 | 1.1822 |
14:48 | 1.2153 |
14:51 | 1.2491 |
14:54 | 1.2832 |
14:57 | 1.3180 |
15:00 | 1.3534 |
15:03 | 1.3894 |
15:06 | 1.4262 |
15:09 | 1.4634 |
15:12 | 1.5015 |
15:15 | 1.5402 |
15:18 | 1.5799 |
15:21 | 1.6201 |
15:24 | 1.6613 |
15:27 | 1.7033 |
15:30 | 1.7462 |
15:33 | 1.7901 |
15:36 | 1.8350 |
15:39 | 1.8809 |
15:42 | 1.9279 |
由建模分析知道:
影长与五个变量有关,分别是太阳高度角、杆高、时间、当地经度和当地纬度。影长由太阳高度角决定,而太阳高度角由杆高、时间、当地经度和当地纬度决定,由此我们采用控制变量法,分别分析这三个参数与影长的关系。
代码:
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
clc;
clear;
% Φ -> A 纬度
% δ -> F 太阳赤道纬度夹角
% ω -> C 太阳时角
% h -> Oh 太阳高度角
% λ -> D 经度
dB = [0.4555 0.4409 0.4247 0.4136 0.3986 0.3919 0.3777 0.3656 0.3582 0.3481 0.3438 0.3305 0.3264 0.3169 0.3120 0.3069 0.2987 0.2928 0.2876 0.2853 ];
dLs = [1.1496 1.1822 1.2153 1.2491 1.2832 1.3180 1.3534 1.3894 1.4262 1.4634 1.5015 1.5402 1.5799 1.6201 1.6613 1.7033 1.7462 1.7901 1.8350 1.8809 1.9279 ];
% 4月18日是一年的第 108 天
n = 108;
% 太阳赤纬夹角(度)
C = 23.45*sin(2*pi*(284+n)/365);
% 太阳时
B = 2*pi*(n -81)/364;
E = 9.87*sin(2*B) - 7.53*cos(B) - 1.5*sin(B);
Jm = 120;
hour = [14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15];
minutes = [42 45 48 51 54 57 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42];
value1 = 0;
value2 = 0;
min = 100000000;
j = 1;
X = [];
Y = [];
MinArr = ones(12,5);
dFsArr = [];
LsArr = [];
DD = ones(12, 20);
LsArrr = ones(12, 21);
% 杆长
for L = 0:0.1:3
% 纬度
for W = 15:0.1:25
% 经度
for J = 105:0.1:115
% 时间
for i = 1:1:21
T0 = hour(i) + minutes(i)/60;
Ts = T0 + E/60 + (J - Jm)/15;
% 太阳时角(度)
S = 15*(Ts - 12);
% 太阳高度角
Oh = asin(sin(W*pi/180)*sin(C.*pi/180) + cos(W*pi/180)*cos(C*pi/180)*cos(S*pi/180));
% 太阳方位角
if(S <0)
Fs = acos( (sin(C*pi/180) - sin(Oh)*sin(W*pi/180)) / (cos(Oh)*cos(W*pi/180)));
FsArr(i) = Fs;
else
Fs = 2*pi - acos( (sin(C*pi/180) - sin(Oh)*sin(W*pi/180)) / (cos(Oh)*cos(W*pi/180)));
FsArr(i) = Fs;
end
if(i >= 2)
value1 = value1 + ( FsArr(i-1) - FsArr(i) - dB(i - 1) )^2;
dFsArr(i-1) = FsArr(i-1) - FsArr(i);
end
% 影长 Ls
Ls = L / tan(Oh);
LsArr(i) = Ls;
value2 = value2 + (Ls - dLs(i))^2;
i = i +1;
end
value = value1/20*value2/21;
%if(value < min)
%min = value;
%MinArr = [L W J]
%end
if (value < 0.0000003)
X(j) = j;
j
Y(j) = value;
LsArrr(j, :) = LsArr;
DD(j, :) = dFsArr*180/pi;
MinArr(j , 1:5) = [j L W J value];
j = j+1;
end
value1 = 0;
value2 = 0;
value = 0;
end
end
end
plot(X, Y,'*');