2012-08-17 42 views

回答

5

這個答案几乎適用於任何可以在MATLAB中被表述爲隱式曲面/曲線的問題。我將在橢圓上演示它。

短版本:

A = [5 4; 4 5]  
c = [1; 2]  
elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1  
ezplot(@(x,y) elFunc(A(1,1),A(2,2),A(1,2),A(2,1),c(1),c(2),x,y), [0 2 0 4]) 

長的版本:

的橢圓形,可以在其最一般的形式含蓄地寫(任何尺寸)爲

(x-c)'A(x-c) = 1 or (x-c)'A(x-c)-1 = 0 

哪裏x,c在R^n中,A是一個n×n矩陣。

爲了將這個轉換成MATLAB可以使用的形式,我們可以使用符號工具箱。 對於2D橢圓我們寫:

syms A11 A12 A21 A22 c1 c2 x y real 
impl = ([x y]-[c1 c2])*[A11 A12; A21 A22]*([x;y]-[c1;c2])-1 

這將產生以下的輸出:

(c1 - x)*(A11*(c1 - x) + A21*(c2 - y)) + (c2 - y)*(A12*(c1 - x) + A22*(c2 - y)) - 1 

我們不需要符號工具箱了,所以我們剛纔複製的字符串,通過增加點操作版本矢量化它並將其變成函數

elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1 

現在我們可以使用ezplot繪製我們的曲線。 ezplot假設當你給它一個函數句柄時,它需要爲func = 0求解,所以我們的曲線已經以隱式格式被elFunc描述了。 我們所要做的就是定義我們想要ezplot嘗試繪製曲線的域。下面的示例演示結果:

A = [5 4; 4 5]  
    c = [1; 2]  
    elFunc = @(A11,A22,A12,A21,c1,c2,x,y) (c1-x).*(A11*(c1-x)+A21*(c2-y))+(c2-y).*(A12*(c1-x)+A22*(c2-y))-1  
    ezplot(@(x,y) elFunc(A(1,1),A(2,2),A(1,2),A(2,1),c(1),c(2),x,y), [0 2 0 4]) 

Ellipse plotted by ezplot in MATLAB

4

這個答案是完全一樣@ twerdster的答案,只是表示法是一個比較Matlabby:

A = [5 4; 4 5]; 
c = [1 2]; 

elFunc = @(x,y) sum(([x(:)-c(1) y(:)-c(2)] * A) .* [x(:)-c(1) y(:)-c(2)], 2) - 1; 
ezplot(elFunc, [0 2 0 4]) 

作爲最後一句話:因爲我們的答案已經表明,ezplot適用於易於繪圖的東西。對於匿名函數而言,橢圓已經處於「簡單」的邊緣,並且已經足夠了,並且ezplot

一般來說,我建議你避免使用ezplot來做比ezplot(@(x)sin(x).*cos(2*x))更難的東西。在function s和plot()surf()以及朋友中練習和流利得多。

+0

它確實是更多的Matlabby :) – twerdster 2012-08-17 14:29:21

+0

+1用於指示'ezplot'不應該用於「複雜」(即真實)繪圖目的。 – Egon 2012-08-17 15:40:24