2014-07-17 23 views
2

我有兩個函數:一個用於直線(y),另一個用於曲線(hnc)。我想確定一個x值處的兩個功能相交在R中的線性和非線性方程之間的交點處求解x值

sigma = 0.075 
mu = 0 
r=0.226 
theta=0.908 
H=0.16 

hnc <- function(x) (1/(sigma*sqrt(2*pi)))*(exp(-(x^2)/(2*(sigma^2)))) 
y <- function(x) 2*pi*x+(pi*r^2/((360/theta)/H)) 

curve(hnc,0,r,n=100,col="blue") 
plot(y,0,r,add=T,col="red") 

我已經使用nleqslv包試過了,但是這導致了不同意(也許是因爲我使用兩個單獨的x值它不正確)

int <- function(x){ 
z <- numeric(2) 
z[1] <- (1/(sigma*sqrt(2*pi)))*(exp(-(x[1]^2)/(2*(sigma^2)))) 
z[2] <- 2*pi*x[2]+(pi*r^2/((360/theta)/H)) 
z} 

nleqslv(c(0.14,0.14),int,method="Broyden") 

任何幫助將不勝感激!

感謝, 埃裏克

回答

7

使用optimize這裏找到最小的一個功能,如果一個變量似乎運作良好

xx <- optimize(function(x) abs(hnc(x)-y(x)), c(.10,.20))$minimum 
abline(v=xx, lty=2) 

enter image description here

2

你是不是在正確的使用nleqslv辦法。它意味着用於求解具有與方程式一樣多的變量的非線性方程組。

你有兩個功能,你想確定在你的情況下,交叉點由x單個值組成。

你需要像這樣定義

g <- function(x) hnc(x) - y(x) 

一個新的功能,然後你可以用uniroot找到g(x)這樣的零:

uniroot(g,c(0,1)) 

發現將0.1417802與所對應的根第一個答案中的圖表。

最小化並不總能找到一個交點;如果沒有交點,你會得到令人誤解的結果。