2017-10-17 13 views
0

J'ai fait un numpy.polyfit() pour latitude, longitude, & données d'altitude pour une orbite satellitaire et interpolé (50 points) avec numpy.polyval(). Maintenant, je veux juste prendre une fenêtre (0-4.5 degrés de longitude) et faire une interpolation de résolution plus élevée (6000 points). Je pense que j'ai besoin d'utiliser les coefficients d'ajustement du premier ajustement basse résolution pour interpoler ma fenêtre de longitude, et je ne suis pas sûr de savoir comment faire.Comment interpoler numpy.polyval et numpy.polyfit python

Entrées:

lat = [27.755611104020687, 22.50661883405905, 17.083576087905502, 11.53891099628959, 5.916633366002468, 0.2555772624429494, -5.407902834141322, -11.037514984810027, -16.594621304857206, -22.03556688048686, -27.308475759820045, -32.34927891621322, -37.07690156937186, -41.38803163295967, -45.15306971601912, -48.21703193866987, -50.41165326774015, -51.58419672864487, -51.63883932997542, -50.57025116952513, -48.46557920053242, -45.47329014246061, -41.76143266388077, -37.48707787049647, -32.782653540783, -27.754184631685046, -22.48503337048438, -17.041097574740743, -11.475689837873944, -5.833592289780744, -0.1543286595142316, 5.525119007560692, 11.167878192881306, 16.73476477885508, 22.18160021405449, 27.455997555900108, 32.493386953033685, 37.21222272985329, 41.508824407948275, 45.25350232626601, 48.291788915858554, 50.45698534747271, 51.59925055739275, 51.62660832560593, 50.53733379179681, 48.420673231121725, 45.42531420150485, 41.71819693220144, 37.45473807165676, 32.76569228387106] 

lon = [-109.73105744378498, -104.28690174554579, -99.2435132929552, -94.48533149079628, -89.91054414962821, -85.42671400689177, -80.94616150449806, -76.38135021210172, -71.6402674905218, -66.62178379632216, -61.21120467960157, -55.27684029674759, -48.66970878028004, -41.23083703244677, -32.813881865289346, -23.332386757370532, -12.832819226213942, -1.5659455609661785, 10.008077792630402, 21.33116444634303, 31.92601575632583, 41.51883213364072, 50.04498630545507, 57.58103957109249, 64.26993028992476, 70.2708323505337, 75.73441871754586, 80.7944079829813, 85.56734813043659, 90.1558676264546, 94.65309120129724, 99.14730128118617, 103.72658922048785, 108.48349841714494, 113.51966824008079, 118.95024882101737, 124.9072309203375, 131.5395221402974, 139.00523971191907, 147.44847902856114, 156.95146022590976, 167.46163867248032, 178.72228750873975, -169.72898181991064, -158.44642409799974, -147.8993300787564, -138.35373014113995, -129.86955508919888, -122.36868103811106, -115.70852432245486] 

alt = [374065.49207488785, 372510.1635949105, 371072.75959230476, 369836.3092635453, 368866.7921820211, 368209.0950216997, 367884.3703536549, 367888.97894243425, 368195.08833668986, 368752.88080031495, 369494.21701128664, 370337.49662954226, 371193.3839051864, 371971.0136622536, 372584.272228585, 372957.752022573, 373032.0104747458, 372767.8112563471, 372149.0940816824, 371184.49208500446, 369907.2992362557, 368373.8795969478, 366660.5935723809, 364859.4071422184, 363072.42955020745, 361405.69765685993, 359962.58417682414, 358837.24421522504, 358108.5277743581, 357834.7679493668, 358049.8054538341, 358760.531463618, 359946.1257064284, 361559.04646970675, 363527.70518032915, 365760.6377191965, 368151.8843206526, 370587.2165838985, 372950.8014553002, 375131.8814988529, 377031.06540952163, 378565.8596562773, 379675.13241518533, 380322.2707576381, 380496.8682141012, 380214.86538256245, 379517.14674525027, 378466.68079100474, 377144.36811517406, 375643.83731560566] 

myOrbitJ2000Time =[ 20027712., 20027713., 20027714., 20027715., 20027716., 
     20027717., 20027718., 20027719., 20027720., 20027721., 
     20027722., 20027723., 20027724., 20027725., 20027726., 
     20027727., 20027728., 20027729., 20027730., 20027731., 
     20027732., 20027733., 20027734., 20027735., 20027736., 
     20027737., 20027738., 20027739., 20027740., 20027741., 
     20027742., 20027743., 20027744., 20027745., 20027746., 
     20027747., 20027748., 20027749., 20027750., 20027751., 
     20027752., 20027753., 20027754., 20027755., 20027756., 
     20027757., 20027758., 20027759., 20027760., 20027761.] 

code:

deg = 30 #polynomial degree for fit 
fittime = myOrbitJ2000Time - myOrbitJ2000Time[0] 

'Latitude Interpolation'  
fitLat = np.polyfit(fittime, lat, deg) 
polyval_lat = np.polyval(fitLat,fittime) 

'Longitude Interpolation' 
fitLon = np.polyfit(fittime, lon, deg) 
polyval_lon = np.polyval(fitLon,fittime) 

'Altitude Interpolation' 
fitAlt = np.polyfit(fittime, alt, deg) 
polyval_alt = np.polyval(fitAlt,fittime) 


'Get Lat, Lon, & Alt values for a window of 0-4.5 deg Longitude' 
lonwindow =[] 
latwindow = [] 
altwindow = [] 
for i in range(len(polyval_lat)): 
    if 0 < polyval_lon[i] < 4.5:   # get lon vals in window 
     lonwindow.append(polyval_lon[i]) #append lon vals 
     latwindow.append(polyval_lat[i]) #append corresponding lat vals 
     altwindow.append(polyval_alt[i]) #append corresponding alt vals 

lonwindow = np.array(lonwindow) 

Pour être clair - La question est que je n'ai qu'un seul point de la plage de la fenêtre, je veux utiliser l'interpolation/équation/courbe de l'étape précédente. Donc, je peux utiliser cela pour interpoler à nouveau et générer 6 000 points dans ma plage de fenêtres.

+0

Quelles valeurs utilisez-vous pour 'myOrbitJ2000Time'? J'ai essayé de deviner 'np.arange (50)' et je ne sais pas si c'est à cause de ça, mais ça veut dire que le polyfit peut être mal conditionné. – Reti43

+0

Désolé oublié. J'ai mis à jour ma question avec les données de temps. Il est toujours dit que le polyfit peut être mal conditionné si vous utilisez un nombre supérieur à ~ 10 pour l'entrée du degré. – Rose

+0

Puisque vos valeurs 'myOrbitJ2000Time' sont séquentielles,' fittime' finit par être 'np.arange (50)' de toute façon. Plus important encore, je viens de réaliser que vos degrés sont une valeur d'angle, tandis que le degré de polyfit fait référence au degré du polynôme. Qu'est-ce que vous essayez exactement de faire? Vos valeurs 'lat' et' lon' sont en degrés. – Reti43

Répondre

0

réponse originale posté here

valeurs En premier lieu, les coefficients de générer ajustement polynomial en utilisant l'ancien temps des valeurs (axe x) et la longitude interpolées (axe y).

import numpy as np 
import matplotlib.pyplot as plt 

poly_deg = 3 #degree of the polynomial fit 
polynomial_fit_coeff = np.polyfit(original_times, interp_lon, poly_deg) 

Ensuite, utilisez np.linspace() pour générer des valeurs arbitraires de temps en fonction du nombre de points de désir dans la fenêtre.

start = 0 
stop = 4 
num_points = 6000 
arbitrary_time = np.linspace(start, stop, num_points) 

Enfin, utilisez les coefficients d'ajustement et le temps arbitraire pour obtenir les valeurs de longitude et l'intrigue réelle interpolée (axe y).

lon_intrp_2 = np.polyval(polynomial_fit_coeff, arbitrary_time) 

plt.plot(arbitrary_time, lon_intrp_2, 'r') #interpolated window as a red curve 
plt.plot(myOrbitJ2000Time, lon, '.') #original data plotted as points