题目
模型假设
- 假设地球为标准球体
- 假设太阳光线为平行光线
- 假设地球自转角速度为常量
- 假设摄像机的摆放与地平线平行
- 假设忽略折射现象的影响
- 在不特别说明的情况下,经度指东经的经度,纬度指北纬的纬度
第一问
第一问思路
各个参数的含义:
- 日期(准确的说叫日期序号,即一年当中的第几天)
- 时间(9点钟对应9,9点10分对应9+10/60)
- 经度
- 纬度
- 直杆高度
查阅资料,找到太阳影子长度和这些参数的关系式,模型即建立完毕。
第一问模型
影子长度
l
l
l,太阳影子顶点横坐标
x
x
x,太阳影子顶点纵坐标
y
y
y,满足关系:
l
=
x
2
+
y
2
l=\sqrt{x^2+y^2}
l=x2+y2
而太阳影子横纵坐标满足关系式:
{
x
=
h
2
tan
2
(
A
−
π
)
tan
2
α
(
1
+
t
a
n
2
(
A
−
π
)
)
y
=
h
2
tan
2
α
(
1
+
t
a
n
2
(
A
−
π
)
)
\begin{cases} x=\sqrt{\frac{h^2\tan^2(A-\pi)}{\tan^2\alpha(1+tan^2(A-\pi))}}\\ y=\sqrt{\frac{h^2}{\tan^2\alpha(1+tan^2(A-\pi))}} \end{cases}
⎩
⎨
⎧x=tan2α(1+tan2(A−π))h2tan2(A−π)y=tan2α(1+tan2(A−π))h2
其中
{
α
=
arcsin
(
sin
ϕ
sin
δ
+
cos
ϕ
cos
δ
cos
ω
)
A
=
arcsin
(
−
sin
ω
cos
δ
cos
α
)
ω
=
15
(
t
s
+
σ
−
120
15
−
12
)
δ
=
23.45
sin
(
2
π
(
284
+
n
)
365
)
\begin{cases} \alpha = \arcsin(\sin\phi \sin \delta+\cos\phi \cos\delta \cos \omega )\\ A = \arcsin\left(\frac{-\sin\omega \cos\delta}{\cos \alpha}\right)\\ \omega = 15\left(t_s+\frac{\sigma-120}{15}-12\right)\\ \delta =23.45\sin\left(\frac{2\pi(284+n)}{365}\right) \end{cases}
⎩
⎨
⎧α=arcsin(sinϕsinδ+cosϕcosδcosω)A=arcsin(cosα−sinωcosδ)ω=15(ts+15σ−120−12)δ=23.45sin(3652π(284+n))
主要参数: ϕ \phi ϕ:北纬度数 、 σ \sigma σ: 东经度数、 t s t_s ts:标准时、 n n n:一年当中的第几天、 h h h:直杆高度
中间参数: δ \delta δ:太阳赤纬角(仅与n有关)、 ω \omega ω:太阳时角(与标准时,所在地区东经度数有关)、 α \alpha α:太阳高度角(与前两个中间参数和北纬度数有关)、 A A A:太阳高度角(与前三个中间参数有关)
第一问求解的python代码
from numpy import *
import matplotlib.pyplot as plt
#防作图中文乱码
plt.rc("font",family='SimHei')
#防作图负号乱码
plt.rc("axes",unicode_minus=False)
#定义变量
# l存储影长
# x存储影子顶点横坐标
# y存储影子顶点纵坐标
# h存储直杆高度
# n存储一年中的第几天
# t存储标准时
# bei_wei存储北纬度数
# dong_jing存储东经度数
# chi_wei_jiao存储太阳赤纬角(仅与n有关)
# shi_jiao存储太阳时角(与标准时和东经度数有关)
# gao_du_jiao存储太阳高度角(与北纬度数,东经度数和太阳时角有关)
# fang_wei_jiao存储太阳方位角(与东经度数,太阳时角和太阳高度角有关)
def f(h=3,n=295,t=12,bei_wei=(39+54/60+26/3600),dong_jing=116+23/60+29/3600):
#将北纬的角度转弧度
bei_wei = bei_wei * pi/180
#由n确定太阳赤纬角(弧度制)
chi_wei_jiao = (23.45*sin(2*pi*(284+n)/365))*pi/180
#由标准时和东经度数确定太阳时角(弧度制)
shi_jiao = (15*(t+(dong_jing-120)/15-12))*pi/180
#太阳高度角的确定(弧度制)
gao_du_jiao = arcsin(sin(bei_wei)*sin(chi_wei_jiao)+cos(bei_wei)*cos(chi_wei_jiao)*cos(shi_jiao))
if gao_du_jiao < 0 or gao_du_jiao > pi/2:
l = 300
else:
l = h/tan(gao_du_jiao)
return l
# 作影子长度与杆高的关系图
# h = linspace(2,4,100000)
# y1 = empty((100000,1))
# for i in range(100000):
# y1[i] = f(h=h[i])
# plt.plot(h,y1)
# plt.xlabel('杆高(m)')
# plt.ylabel('影子长度(m)')
# 作影子长度与日期的关系图
# n = linspace(0,365,100000)
# y2 = empty((100000,1))
# for i in range(100000):
# y2[i] = f(n=n[i])
# plt.plot(n,y2)
# plt.xlabel('日期(天)')
# plt.ylabel('影子长度(m)')
# 作影子长度与时间的关系图
# t = linspace(0,24,100000)
# y3 = empty((100000,1))
# for i in range(100000):
# y3[i] = f(t=t[i])
# plt.plot(t,y3)
# plt.ylim(0,301)
# plt.xlabel('时间(h)')
# plt.ylabel('影子长度(m)')
# 作影子长度与北纬度数的关系图
# bei_wei = linspace(-90,90,100000)
# y4 = empty((100000,1))
# for i in range(100000):
# y4[i] = f(bei_wei=bei_wei[i])
# plt.plot(bei_wei,y4)
# plt.ylim(0,301)
# plt.xlabel('北纬度数(°)')
# plt.ylabel('影子长度(m)')
#作影子长度与东经度数的关系图
# dong_jing= linspace(-180,180,100000)
# y5 = empty((100000,1))
# for i in range(100000):
# y5[i] = f(dong_jing=dong_jing[i])
# plt.plot(dong_jing,y5)
# plt.ylim(0,301)
# plt.xlabel('东经度数(°)')
# plt.ylabel('影子长度(m)')
# 模型应用
# t = linspace(9,15,100000)
# y6 = empty((100000,1))
# for i in range(100000):
# y6[i] = f(t=t[i])
# plt.plot(t,y6)
# plt.xlabel('时间')
# plt.ylabel('影子长度(m)')
# 计算影子最短的时候和这个时候的影子长度
# x0 = t[0]
# for i in range(99999):
# if f(t=t[i+1]) < f(t=t[i]):
# x0 = t[i+1]
# fen_zhong = (x0 - x0//1)*60
# miao_zhong = (fen_zhong-fen_zhong//1)*60
# print("%d:%d:%d"%(x0//1,fen_zhong,miao_zhong))
# print("%.4f"%f(t=x0))
#显示图像
plt.show()