2014-07-17 22 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与所对应的根第一个答案中的图表。

最小化并不总能找到一个交点;如果没有交点,你会得到令人误解的结果。