2013-02-05 38 views
13

Tôi đang cố gắng hiểu cách tạo bảng dự báo thủy triều bằng cách sử dụng hằng số hài hòa.Làm thế nào để dự đoán thủy triều bằng cách sử dụng hằng số hài hòa

tôi đã sử dụng các hằng số điều hoà từ Bridgeport (http://tidesandcurrents.noaa.gov/data_menu.shtml?stn=8467150%20Bridgeport,%20CT&type=Harmonic%20Constituents)

Và tóm tắt các thành phần thủy triều sử dụng kịch bản python này -

import math 
import time 

tidalepoch = 0 
epoch = time.mktime(time.gmtime()) - tidalepoch 
f = open('bridgeport.txt', 'r') 
M_PI = 3.14159 
lines = f.readlines() 
t = epoch - 24 * 3600 
i = -24 
while t < epoch: 
    height = 0 
    for line in lines: 
    x = line.split() 
    A = float(x[2]) # amplitude 
    B = float(x[3]) # phase 
    B *= M_PI/180.0 
    C = float(x[4]) # speed 
    C *= M_PI/648000 

    # h = R cost (wt - phi) 
    height += A * math.cos(C * t - B) 

    print str(i) + " " + str(height + 3.61999) 
    i += 1 
    t += 3600 

Đó in một chiều cao mỗi giờ cho 'hôm nay. Chiều cao kết quả là trong khoảng tôi mong đợi, -0,5 đến 7,5 feet, nhưng không chính xác cho ngày.

Tôi có đi đúng hướng không? Làm cách nào để xác định kỷ nguyên thủy triều? Trong ví dụ Doodsen trên wikipedia (http://en.wikipedia.org/wiki/Arthur_Thomas_Doodson), họ đã sử dụng 0 để có kết quả vào ngày 1 tháng 9 năm 1991. Nhưng chúng có giá trị hài hòa khác với giá trị hiện tại được đăng và ngày đó dường như không hoạt động đối với tôi.

Dưới đây là nội dung của tập tin bridgeport.txt tôi -

1 M2      3.251 109.6 28.9841042 
2 S2      0.515 135.9 30.0000000 
3 N2      0.656 87.6 28.4397295 
4 K1      0.318 191.6 15.0410686 
5 M4      0.039 127.4 57.9682084 
6 O1      0.210 219.5 13.9430356 
7 M6      0.044 353.9 86.9523127 
8 MK3      0.023 198.8 44.0251729 
9 S4      0.000 0.0 60.0000000 
10 MN4      0.024 97.2 57.4238337 
11 NU2      0.148 89.8 28.5125831 
12 S6      0.000 0.0 90.0000000 
13 MU2      0.000 0.0 27.9682084 
14 2N2      0.077 65.6 27.8953548 
15 OO1      0.017 228.7 16.1391017 
16 LAM2      0.068 131.1 29.4556253 
17 S1      0.031 175.5 15.0000000 
18 M1      0.024 264.4 14.4966939 
19 J1      0.021 237.0 15.5854433 
20 MM      0.000 0.0 0.5443747 
21 SSA      0.072 61.2 0.0821373 
22 SA      0.207 132.0 0.0410686 
23 MSF      0.000 0.0 1.0158958 
24 MF      0.000 0.0 1.0980331 
25 RHO      0.015 258.1 13.4715145 
26 Q1      0.059 205.7 13.3986609 
27 T2      0.054 106.4 29.9589333 
28 R2      0.004 136.9 30.0410667 
29 2Q1      0.014 238.8 12.8542862 
30 P1      0.098 204.1 14.9589314 
31 2SM2      0.000 0.0 31.0158958 
32 M3      0.012 200.1 43.4761563 
33 L2      0.162 134.1 29.5284789 
34 2MK3      0.015 203.7 42.9271398 
35 K2      0.150 134.7 30.0821373 
36 M8      0.000 0.0 115.9364166 
37 MS4      0.000 0.0 58.9841042 

Trả lời

3

Nếu bạn đang sử dụng C một cách tiếp cận sẽ là sử dụng libTCD http://www.flaterco.com/xtide/libtcd.html để lưu trữ dữ liệu cấu thành, điều này cung cấp một khuôn khổ tốt để truy cập dữ liệu.

Để thực hiện các phép tính bạn cần điều chỉnh kỷ nguyên để bắt đầu năm hiện tại. Mã này sử dụng các hàm từ libTCD và dựa trên các thuật toán được sử dụng trong xTide.

TIDE_RECORD record; 
int readStatus = read_tide_record(self.stationID, &record); 
int epochStartSeconds = staringSecondForYear(year); 

for (unsigned constituentNumber=0; constituentNumber<constituentCount; constituentNumber++) { 
    float constituentAmplitude = record.amplitude[constituentNumber]; 
    float nodeFactor = get_node_factor(constituentNumber, year); 
    amplitudes[constituentNumber] = constituentAmplitude * nodeFactor; 

    float constituentEpoch = deg2rad(-record.epoch[constituentNumber]); 
    float equilibrium = deg2rad(get_equilibrium(constituentNumber, year)); 
    phases[constituentNumber] = constituentEpoch + equilibrium; 
} 

Sau đó tính toán thủy triều cho bù đắp kể từ đầu năm đến nay:

- (float)getHeightForTimeSince1970:(long)date { 
    //calculate the time to use for this calculation 
    int secondsSinceEpoch = date - epochStartSeconds; 

    float height = 0; 
    for(int i = 0; i < constituentCount; i++) { 
    float degreesPerHour = get_speed(i); 
    float radiansPerSecond = degreesPerHour * M_PI/648000.0; 
    height += amplitudes[i] * cos(radiansPerSecond * secondsSinceEpoch + phases[i]); 
    } 

    height += record.datum_offset; 
    return height; 
} 
3

Các National Tidal Datum Epoch không liên quan đến các Unix epoch; đó là một tham chiếu về cường độ thủy triều trung bình trong khoảng thời gian đó. Dữ liệu Bridgeport chứa một cường độ và pha cho mỗi thành phần, và sau đó cung cấp tần số của thành phần trong cột cuối cùng. Giai đoạn này liên quan đến GMT (GMT là 0 độ), vì vậy hãy chỉ định thời gian tính bằng giờ theo giờ GMT, hoặc bù lại theo múi giờ. Cột cuối cùng là một hàm của thành phần, không phải là vị trí, vì vậy cột đó giống nhau cho bất kỳ vị trí nào. Vì vậy, vấn đề là tổng hợp sinusoids của các tần số khác nhau, như phân tích Fourier. Hàm kết quả rất có thể là không phải có thời gian 24 giờ vì các thành phần đều có các khoảng thời gian khác nhau (không phải 24 giờ). Tôi đã sử dụng this làm tài liệu tham khảo.

Trong mã bên dưới, tôi đã bao gồm một số đối số tùy chọn để thêm một số công cụ sửa đổi bù đắp (như 3.16999 của bạn, không chắc là từ đâu). Tôi đã tách mã đọc và phân tích cú pháp khỏi mã tính toán. Hàm trả về từ get_tides chứa dữ liệu đo được trong một closure. Bạn không phải làm theo cách đó và có thể sử dụng một lớp học thay thế.

from __future__ import division 
import math 
import time 

def get_tides(fn): 
    """Read tide data from file, return a function that 
    gives tide level for specified hour.""" 
    with open(fn,'r') as fh: 
     lines = fh.readlines() 

    measured = [] 
    for line in lines: 
     index,cons,ampl,phase,speed = line.split() 
     measured.append(tuple(float(x) for x in (ampl,phase,speed))) 

    def find_level(hour,total_offset=0,time_offset=0): 
     total = total_offset 
     for ampl,phase,speed in measured: 
      # you could break out the constituents here 
      # to see the individual contributions 
      cosarg = speed * (hour + time_offset) + phase 
      total += ampl * math.cos(cosarg * math.pi/180) # do rad conversion here 
     return total 

    return find_level 


bridgeport = get_tides('bridgeport.txt') 

for hour in range(-24,25,1): 
    print("%3sh %7.4f" % (hour,bridgeport(hour,total_offset=3.61999))) 

Và kết quả:

-24h -0.5488 
-23h -1.8043 
-22h -1.7085 
-21h -0.3378 
-20h 1.8647 
-19h 4.4101 
-18h 6.8374 
-17h 8.5997 
-16h 9.1818 
-15h 8.4168 
-14h 6.5658 
-13h 4.1003 
-12h 1.5669 
-11h -0.3936 
-10h -1.2009 
-9h -0.6705 
-8h 0.9032 
-7h 3.0316 
-6h 5.2485 
-5h 7.0432 
-4h 7.8633 
-3h 7.4000 
-2h 5.8028 
-1h 3.5317 
    0h 1.1223 
    1h -0.8425 
    2h -1.7748 
    3h -1.3620 
    4h 0.2196 
    5h 2.4871 
    6h 4.9635 
    7h 7.2015 
    8h 8.6781 
    9h 8.9524 
10h 7.9593 
11h 6.0188 
12h 3.6032 
13h 1.2440 
14h -0.4444 
15h -0.9554 
16h -0.2106 
17h 1.4306 
18h 3.4834 
19h 5.5091 
20h 7.0246 
21h 7.5394 
22h 6.8482 
23h 5.1795 
24h 2.9995 

EDIT: Đối với một ngày cụ thể, hoặc thời gian bây giờ là:

import datetime 

epoch = datetime.datetime(1991,9,1,0,0,0) 
now = datetime.datetime.utcnow() 
hourdiff = (now-epoch).days*24 

for hour in range(0,25,1): 
    print("%3sh %7.4f" % (hour,bridgeport(hour+hourdiff))) 
+0

Bạn sử dụng giá trị đầu vào nào để nhận thủy triều cho ngày hiện tại? –

+0

Xem chỉnh sửa. Tôi không chắc chắn nên sử dụng điều gì làm điểm xuất phát cuối cùng, vì tôi không thể tìm thấy một nguồn rõ ràng nào ngoài OP được trích dẫn. Tuy nhiên, một ngày về phía giữa của NTDE có vẻ hợp lý. Trong mọi trường hợp, bạn có thể cắm vào ngày bạn chọn. – engineerC

+0

Tôi là đồng nghiệp của OP. Tôi nghĩ rằng mã của bạn về cơ bản giống như những gì chúng tôi đã viết. Chúng tôi đang cố gắng viết một ứng dụng có thể hiển thị dữ liệu thủy triều cho một ngày cụ thể, nhưng cũng bị mất để tìm ra những gì epoch thủy triều để sử dụng. Tôi đã cố gắng sử dụng ngày 1991, cũng như ngày 1 tháng 1 năm 1983 và ngày 31 tháng 12 năm 2001, bởi vì những năm đó được trích dẫn trên http://tidesandcurrents.noaa.gov/data_menu.shtml?stn=8467150%20Bridgeport,%20CT&type= Datums. Không ai trong số này dường như để tạo ra kết quả chính xác. –

0

Các "giai đoạn được tính theo độ, tham chiếu đến giờ "trên liên kết của bạn có nghĩa là thủy triều Bridgeport là" giai đoạn "độ ra khỏi đồng bộ từ thủy triều" cân bằng "lý thuyết tại Greenwich Meridian.

Bạn cũng sẽ cần thủy triều cân bằng dưới dạng hàm thời gian. Một phương pháp sẽ là sao chép các hằng số từ cột 2010 http://coastalengineeringmanual.tpub.com/Part-II-Chap5/Part-II-Chap50024.htm và sử dụng 2010-01-01T00: 00: 00 làm mốc thời gian/epoch/zero của bạn.

Ngoài ra, còn có một yếu tố nút điều chỉnh một số thành phần tùy thuộc vào tiền đề nút của mặt trăng.

Thay vì sao chép từ bảng, bạn có thể chỉnh sửa và chạy thủy triều_fac.f chương trình từ http://adcirc.org/home/related-software/adcirc-utility-programs/ để tạo ra một tập hợp các yếu tố nút và các thành phần thủy triều cân bằng tại mốc thời gian/epoch/zero của bạn đã chọn.

Dưới đây là kết quả từ một chương trình sửa đổi tide_fac.f để sản xuất các đối số giai đoạn đầu mối và thủy triều cân bằng cho 2013-01-01T00: 00: 00:

TIDAL FACTORS STARTING: HR- 0.00, DAY- 1, MONTH- 1 YEAR- 2013 

FOR A RUN LASTING 365.00 DAYS 


CONST NODE  EQ ARG (ref GM) 
NAME FACTOR (DEG) 


M2 1.02718  270.21 
S2 1.00000  0.00 
N2 1.02718  16.12 
K1 0.92336  17.70 
M4 1.05510  180.42 
O1 0.87509  248.94 
M6 1.08377  90.63 
MK3 0.94846  287.91 
S4 1.00000  0.00 
MN4 1.05510  286.33 
NU2 1.02718  73.02 
S6 1.00000  0.00 
MU2 1.02718  178.93 
2N2 1.02718  122.03 
OO1 0.63334  333.60 
LAMB 1.02718  287.40 
S1 1.00000  180.00 
M1 0.00000  159.37 
J1 0.89282  275.36 
MM 1.09369  254.09 
SSA 1.00000  201.62 
SA 1.00000  280.81 
MSF 1.02718  91.28 
MF 0.74476  312.33 
RHO1 0.87509  51.75 
Q1 0.87509  354.85 
T2 1.00000  2.35 
R2 1.00000  177.65 
2Q1 0.87509  100.76 
P1 1.00000  349.19 
2SM2 1.02718  89.79 
M3 1.04114  225.31 
L2 0.00000  348.15 
2MK3 0.97424  162.72 
K2 0.81662  214.58 
M8 1.11323  0.84 
MS4 1.02718  270.21 
1

Tôi vừa mới viết một thư viện Python nhỏ gọi là Pytides để phân tích thủy triều và dự đoán. Nó vẫn còn trong giai đoạn đầu, nhưng bạn có thể đạt được những gì bạn muốn khá dễ dàng bằng cách sử dụng nó. Tôi đã viết an example về cách thực hiện. Như Dave đã đề cập, lý do mà phương pháp của bạn không hoạt động là các giai đoạn NOAA được xuất bản liên quan đến các đối số cân bằng của các thành phần, vì vậy bạn cần một số cách để làm việc với các đối số cân bằng này. bạn!).

+1

Đậu mát mẻ! Chúng tôi đã làm những gì được đăng trong câu trả lời được chấp nhận (tôi làm việc với người trả lời). –

Các vấn đề liên quan