いくつかのこと:
線形関数 y=mx+b がある場合、その線の角度は でありatan(m)
、 ではありませんm
。これらは小さなm', but very different for large
m` の場合とほぼ同じです。
2+ 次の polyfit の線形成分は、1 次の polyfit の線形成分とは異なります。1 回は作業レベルで、もう 1 回は 1 次近似で、データを 2 回近似する必要があります。
勾配m
が与えられた場合、三角関数を使用するよりも回転行列を計算するより良い方法があります (例: cos(atan(m))
)。ジオメトリを実行するときは常に三角関数を避け、線形代数演算に置き換えるようにしています。これは通常より高速であり、特異点に関する問題が少なくなります。以下のコードを参照してください。
この方法は、一部の軌道で問題を引き起こす可能性があります。たとえば、南北の軌道を考えてみましょう。しかし、それはより長い議論です。
説明した方法と上記の注意事項を使用して、これを実装するサンプル コードを次に示します。
%Setup some sample data
long = linspace(1.12020, 1.2023, 1000);
lat = sin ( (long-min(long)) / (max(long)-min(long))*2*pi )*0.0001 + linspace(.2, .31, 1000);
%Perform polynomial fit
p = polyfit(long, lat, 4);
%Perform linear fit to identify rotation
pLinear = polyfit(long, lat, 1);
m = pLinear(1); %Assign a common variable for slope
angle = atan(m);
%Setup and apply rotation
% Compute rotation metrix using trig functions
rotationMatrix = [cos(angle) sin(angle); -sin(angle) cos(angle)];
% Compute same rotation metrix without trig
a = sqrt(m^2/(1+m^2)); %a, b are the solution to the system:
b = sqrt(1/(1+m^2)); % {a^2+b^2 = 1}, {m=a/b}
% %That is, the point (b,a) is on the unit
% circle, on a line with slope m
rotationMatrix = [b a; -a b]; %This matrix rotates the point (b,a) to (1,0)
% Generally you rotate data after removing the mean value
longLatRotated = rotationMatrix * [long(:)-mean(long) lat(:)-mean(lat)]';
%Plot to confirm
figure(2937623)
clf
subplot(211)
hold on
plot(long, lat, '.')
plot(long, polyval(p, long), 'k-')
axis tight
title('Initial data')
xlabel('Longitude')
ylabel('Latitude')
subplot(212)
hold on;
plot(longLatRotated(1,:), longLatRotated(2,:),'.b-');
axis tight
title('Rotated data')
xlabel('Rotated x axis')
ylabel('Rotated y axis')