[英]Which R function can I use to find intersection points of two lines?
[英]In R, find non-linear lines from two sets of points and then find the intersection of those points
使用R,我想使用來自兩個向量的點估計兩條曲線,然后找到那些估計曲線相交的x和y坐標。
在玩家“t”和“p”的戰略環境中,我正在模擬兩個玩家的最佳回應,以回應對方在戰略環境(博弈論)中所選擇的內容。 問題是我沒有函數或線,我有兩組來自模擬的點,一組點對應於玩家對另一個玩家給定動作的最佳響應。 實際的數學對我(或matlab)來說太難解決了,這就是我使用這種模擬視覺方法的原因。 我想使用這些點來估計最佳響應函數(即創建非線性曲線),然后獲取兩條估計曲線並找到它們相交的位置,以便識別納什均衡(最佳響應曲線相交的位置)。
舉個例子,我正在使用兩個這樣的向量:
t=c(10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.1,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0)
p=c(12.3,12.3,12.3,12.3,12.3,12.3,12.4,12.4,12.4,12.5,12.5,12.5,12.6,12.6,12.7,12.7,12.8,12.8,12.9,12.9,13.0,13.1,13.1,13.2,13.3,13.4,13.5,13.4,13.5,13.6,13.6,13.7,13.8,13.8,13.9,13.9,13.9,14.0,14.0,14.0,14.0)
對於第一行,樣本由(t,a)組成,對於第二行,樣本由(a,p)組成,其中a是由給定的第三個向量
a = seq(10, 14, by = 0.1)
例如,對應於第一個矢量的樣本的第一個點是(10.0,10.0),第二個點是(10.0,10.1)。 對應於第二個向量的樣本的第一個點是(10.0,12.3),第二個點是(10.1,12.3)。
我最初嘗試做的是使用由lm模型生成的多項式來估計線條,但那些似乎並不總是有效:
plot(a,t, xlim=c(10,14), ylim=c(10,14), col="purple")
points(p,a, col="red")
fit4p <- lm(a~poly(p,3,raw=TRUE))
fit4t <- lm(t~poly(a,3,raw=TRUE))
lines(a, predict(fit4t, data.frame(x=a)), col="purple", xlim=c(10,14), ylim=c(10,14),type="l",xlab="p",ylab="t")
lines(p, predict(fit4p, data.frame(x=a)), col="green")
fit4pCurve <- function(x) coef(fit4p)[1] +x*coef(fit4p)[2]+x^2*coef(fit4p)[3]+x^3*coef(fit4p)[4]
fit4tCurve <- function(x) coef(fit4t)[1] +x*coef(fit4t)[2]+x^2*coef(fit4t)[3]+x^3*coef(fit4t)[4]
a_opt1 = optimise(f=function(x) abs(fit4pCurve(x)-fit4tCurve(x)), c(10,14))$minimum
b_opt1 = as.numeric(fit4pCurve(a_opt1))
編輯:修復類型后,我得到正確的答案,但如果樣品沒有干凈地回來,它並不總是有效。
所以我的問題可以分解幾個方面。 首先,有沒有更好的方法來完成我想要做的事情。 我知道我所做的事情無論如何都不是完全准確的,但對於我的目的來說,它似乎是一個不錯的近似值。 其次,如果沒有更好的方法,我是否有辦法改進上面列出的方法。
重新啟動R會話,確保清除所有變量並復制/粘貼此代碼。 我在引用的變量中發現了一些錯誤。 另請注意, R
區分大小寫。 我懷疑你一直在覆蓋變量。
plot(a,t, xlim=c(10,14), ylim=c(10,14), col="purple")
points(p,a, col="red")
fit4p <- lm(a~poly(p,3,raw=TRUE))
fit4t <- lm(t~poly(a,3,raw=TRUE))
lines(a, predict(fit4t, data.frame(x=a)), col="purple", xlim=c(T,P), ylim=c(10,14),type="l",xlab="p",ylab="t")
lines(p, predict(fit4p, data.frame(x=a)), col="green")
fit4pCurve <- function(x) coef(fit4p)[1] +x*coef(fit4p)[2]+x^2*coef(fit4p)[3]+x^3*coef(fit4p)[4]
fit4tCurve <- function(x) coef(fit4t)[1] +x*coef(fit4t)[2]+x^2*coef(fit4t)[3]+x^3*coef(fit4t)[4]
a_opt = optimise(f=function(x) abs(fit4pCurve(x)-fit4tCurve(x)), c(T,P))$minimum
b_opt = as.numeric(fit4pCurve(a_opt))
正如您將看到的:
> a_opt
[1] 12.24213
> b_opt
[1] 10.03581
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.