2013-08-29 3 views
-1

У меня есть полином y = 0.230 + -0.046*x + -0.208*x^2. Я хочу рассчитать перпендикуляр к этой линии, отрезая другую линию (X, Y).Как вычислить уравнение для перпендикулярной полиномиальной линии

+0

Возможный дубликат [Как рассчитать нормальный вектор отрезка?] (Http://stackoverflow.com/questions/1243614/how-do-i-calculate-the-normal-vector-of-a -line-segment) – Schorsch

+1

или возможный дубликат [Как найти нормальный вектор в точке на кривой в Matlab] (http://stackoverflow.com/questions/17324936/how-to-find-the-normal- vector-at-a-point-on-a-curve-in-matlab) – Schorsch

+0

@Schorsch это, по общему признанию, основная математическая проблема, но эти ссылки не предоставляют полного решения, только половину этого ... –

ответ

0
%Example data 
    x=0:0.1:10; 
    y = 0.230 + -0.046*x + -0.208*x.^2 ;  
    plot(x,y); 

%Find the tangent and normals at all points 
    dy = [0 diff(y)./diff(x)]; 
    py = -1./dy; 

%Choose a point 
    n = 60; 
    X = x(n); 
    Y = y(n); 
    hold on 
    plot(X, Y, 'or') 

%Find the equation of the straight line normal to that point. You can do this in one step (yn = py(n)*(x - X) + Y) but I've done it in two to illustrate where this comes from 
    c = Y - py(n)*X; 
    yn = py(n)*x + c; 
    plot(x, yn, 'g') 
+1

Ваши производные потребности fix: 'dx = x (2) -x (1); py = -dx./dy; ' –

+1

@TryHard Спасибо, я исправил его. Теперь 'dy' встречается с помощью' diff (y) ./ diff (x) ' – Dan

+0

Привет, Dan и Try Hard спасибо вам за помощь. Еще один вопрос, чтобы закончить эту запись, вы, например, xy сделали с <1x101 double > horizontal [link] (http://pro.ellip6.com/SebastienForum/Tab1.jpg), а мой - вертикальный [ссылка] (http://pro.ellip6.com/SebastienForum/Tab2.jpg), как я могу конвертировать от моего до твоего или изменить свой код. Спасибо – user2724407

1

Альтернативой является вычисление аналитического результата, который не является ужасно трудным. (вы можете использовать символический набор инструментов для этого, но NN сидит на голове будет делать):

%Example data 
x=0:0.1:10; 
y = 0.230 + -0.046*x + -0.208*x.^2 ; 
plot(x,y); 

%Find the tangent and normals at all points (*edited*) 
slope = (-0.046 + -2*0.208*x); 
py = -1./slope;   % <-- modified from Dan's expression 
          %  to use analytical derivative 


%Choose a point 
n = 60; 
X = x(n); 
Y = y(n); 
hold on 
plot(X, Y, 'or') 

% Copying @Dan: Find the equation of the straight line normal to that point. You can do this in one step (yn = py(n)*(x - X) + Y) but I've done it in two to illustrate where this comes from 
c = Y - py(n)*X; 
yn = py(n)*x + c; 
plot(x, yn, 'g') 
axis tight equal 

Использование axis equal также является хорошей идеей в этом примере, чтобы увидеть, что у вас действительно есть ортогональные кривые.

+0

спасибо, если мое уравнение имеет более высокий порядок с x.^3 и x.^4, как я могу изменить свой код, который отлично подходит для меня с помощью второго порядка. – user2724407

+1

@ user2724407 вам нужно вычислить * аналитическую производную (наклон) вашего полинома и заменить там, где я отредактировал, введя переменную 'slope'. –

+0

Спасибо, что сделали. С найденным уравнением я хочу найти пересечение с другой кривой, построенной из массива double. – user2724407

Смежные вопросы