2013-04-29 48 views
1

我有一個起點(X,Y)和起始方向(V1,V2)。我也有兩個具體的曲線線條穿過我的曲線?

g1: 2*x - (y)^2 - 1 = 0; 
g2: 9 - 0.8*(x)^2 - 2*y = 0; 

我需要知道將在第一個路口發生任何給定(X,Y)(V1,V2)(或者,如果不發生它在所有在一些固定的距離內)。

最簡單的方法是什麼?我應該考慮哪些標準的MatLab方法?


例如(X,Y)=(0,0)和(V1,V2)=(1,1)。第一個交叉點發生在(1,1)並且它是曲線的一個點g1曲線。

intersection

+0

所以,你說你的cruves被查出服用片出各面的(G1,G2)在(V1,V2)方向? – Dan 2013-04-29 14:51:36

+1

@丹g1和g2是一架飛機上的簡單曲線。我糾正了我的帖子。對此感到抱歉。 – Pranasas 2013-04-29 14:54:52

+0

您是否已經嘗試過使用符號工具箱?或者你更喜歡數字解決方案? – fpe 2013-04-29 15:35:43

回答

1

爲了找到兩條曲線的交點:

申報g1和g2作爲顯式匿名功能

g1 = @(x)(sqrt(2*x - 1)); 
g2 = @(x)(-0.4*x.^2 + 4.5); 

選擇一個範圍對於x來測試過:

xmin = 0; 
xmax = 100; 
xres = 0.1; 
x = xmin:xres:xmax; 

查找曲線

G1 = g1(x); 
G2 = g2(x); 

現在尋找到圖表相互交叉索引:

ind = find(diff(G1 > G2)); 

現在很容易到指數轉換爲x值:

xval = xmin + (ind(1)-1)*xres 

編輯:

所以我現在假設你的(V1,V2)只是一個單位方向vec從起源?如果是這樣,我們可以創建一條直線y = mx + c,並找出相交g1和g2的位置。

m = V2/V1; 
c = Y - m*X; 
line = @(x)(m*x + c); 

現在只是按照上面的步驟找到lineg1和也lineg2交點。如果V1爲負數,則設置xmax = X,否則設置爲xmin = X,以便您查找正確方向的交點。如果沒有交點,xval行可能會出錯,因此在那裏添加一些錯誤檢查。然後隨便挑最小的XVAL如果V1是正的或更大的,如果V1是負

if V1 >= 0 
    xmin = X; 
    xmax = X + 100; 
else 
    xmin = X - 100; 
    xmax = X; 
end; 

xres = 0.1; 
x = xmin:xres:xmax; 

G1 = g1(x); 
G2 = g2(x); 
L = line(x); 
ind1 = find(diff(G1 > L)); 
xval1 = xmin + (ind1(1)-1)*xres 
ind2 = find(diff(G2 > L)); 
xval2 = xmin + (ind2(1)-1)*xres 

xval = (V1 > 0)*max(xval1, xval2) + (V2 < 0)*max(xval1, xval2); 
yval = line(xval); 
+0

我不確定您是否想給我一個提示,因爲g1和g2總是相同。這是任意的起點和開始方向。這有效地引入了必須照顧的第三條曲線(一條線)。那麼我會盡力弄清楚。 – Pranasas 2013-04-29 15:38:25

+1

我不明白你開始的方向是什麼意思,你提供了兩條明確的曲線。我明白起點(只需更改上面代碼中的'xmin'),但是您指的是什麼?你可以增加'x'或減少'x'?哦,除非我用sqrt將曲線減半... – Dan 2013-04-29 15:40:45

+0

所以我的方法爲-ve根給出了'x' = 2.5 + ve根和'x' = 4.2。所以我想這就是你的方向發揮作用。 – Dan 2013-04-29 15:47:41

0

我會做這樣的方式,但我目前還不能對其進行測試:

編輯3

現在我應該解釋的問題以正確的方式:所以我會繼續這樣說:

f1 = @(x) x - (sqrt(2.*x - 1)); 
f2 = @(x) x - (4.5 - 0.4.*(x).^2); 
x1 = fsolve(f1,x01) 
x2 = fsolve(f2,x02) 

這應該導致你預期結果:

x1 = 1; 
x2 = 2.3295; 

,或者,你可以遵循象徵性的做法:

syms x; 
x1 = double(solve(x - sqrt(2*x - 1))); 
x2 = double(solve(x - (4.5 - 0.4*x^2))); 
+0

我添加了一張圖片到我原來的帖子,以表示(希望以更清晰的方式)我實際上感興趣的路口。 – Pranasas 2013-04-29 16:03:11

+0

@Pranasas:我剛剛更新了答案;檢查它是否適合您的需求。 – fpe 2013-04-29 17:43:37

0
% find intersect point of two curves 
% x -> independent variable 
% y1, y2 -> curves that intersects 
% xc, yc -> intersect cordinate 

function [xc, yc, crossIdx] = findIntersectPoint(x, y1, y2) 
    crossIdx = inf; 
    xRes = (x(end) - x(1))/(length(x) - 1); 
    for xVal = x(1):xRes:x(end) 
     idx = fix((xVal - x(1))/xRes + 2); 
     if ((y1(idx-1) <= y2(idx-1)) && (y1(idx) >= y2(idx))) 
      crossIdx = idx; 
      break; 
     end 
    end 
    if(crossIdx ~= inf) 
     xc = x(crossIdx); 
     yc = y1(crossIdx); 
    else 
     xc = nan; 
     yc = nan; 
    end 
end