椭圆使用最小二乘法

时间:2018-03-17 01:22:04

标签: matlab contour

x = [1.02 .95 .87 .77 .67 .56 .44 .30 .16 .01]';
y = [0.39 .32 .27 .22 .18 .15 .13 .12 .13 .15]';

% function Ax = b
N = numel(x);
A = [x.^2 x.*y y.^2 x y];
b = [-1*ones(N,1)];

%coeffs = [a b c d e]';
coeffs = A\b; 

a = coeffs(1)
b = coeffs(2);
c = coeffs(3);
d = coeffs(4);
e = coeffs(5);

plot(x,y, 'bo')
hold on

% prepare contour plot
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
%set deltas 
deltay = .001;
deltax = .001;
%create arrays X and Y
[X,Y] = meshgrid(xmin:deltax:xmax,ymin:deltay:ymax);
% evaluate quadratic form 
Z = a*X.^2 + b*X.*Y + c*Y.^2 + d*X + e*Y +f;
% plot where Z =0. line
contour(X,Y,Z,[0,0])
title('Planetary Orbit');

我正在尝试制作一个椭圆,但代码正在制作一个抛物线。我假设它是从我设置轮廓图的方式。如果有人能给我一些关于需要改变什么的方向,那将非常感激。

1 个答案:

答案 0 :(得分:0)

如果你plot(x,y),你会发现输入数据只是轨道的一小部分。因为您将绘图的限制(xminxmax等)设置为输入数据的边界框,所以绘图将仅显示此边界框内椭圆的部分。

简单地放大边界框将显示完整的椭圆:

% OP's code here
f = 1;
xmin = -0.6; % enlarge the bounding box
xmax = 1.2;
ymin = 0;
ymax = 1.3;
[X,Y] = meshgrid(xmin:deltax:xmax,ymin:deltay:ymax);
Z = a*X.^2 + b*X.*Y + c*Y.^2 + d*X + e*Y +f;
contour(X,Y,Z,[0,0])
axis equal
hold on
plot(x,y,'r.') % Data points on top of the ellipse