2012-07-16 142 views
-4

我試圖解決逆問題以下功能R.給出的答案

x + 2 (C1 * y) + C1 * C1 * z = d2 

我目前可以進入C1並獲得d2但需要輸入d2並獲得當查找函數的係數C1。變量x,yz都是已知的並且永遠不會改變。

我已經有一些已知的使用C1d2值。

C1  d2 
5 0.000316 
0 0.000193 
-5 0.00

是否有R功能,這將讓我進入功能,以前的結果和d2值和它返回C1係數?

+8

代數是1000多年前發明的,用於解決這類問題。 – Andrie 2012-07-16 15:39:30

+0

@Andrie我確定這是。我也認爲有人會創建一個R包來幫助解決這個問題。 – TrueWheel 2012-07-16 15:44:19

+0

嗯,我想你可以嘗試[聊天[(http://chat.stackoverflow.com/)這種問題。 – 2012-07-16 15:49:40

回答

6

你有一個二次方程的f ORM:

(x - d2)*C1^0 + (2*y)*C1^1 + (z)*C1^2 = 0 

在R中可以解決與功能polyroot()二次方程式(實際上任何多項式方程):

x <- 1 
y <- 2 
z <- 3 

d <- 0 

polyroot(c(x-d, 2*y, z)) 
[1] -0.3333333+0i -1.0000000+0i 

(可提供兩種解決方案,正如你所期望)

爲了解決一系列的輸入值,你需要把它放到你最喜歡的apply函數中,在這種情況下爲sapply()

d <- seq(0, 1, 0.2) 

sapply(d, function(dd)polyroot(c(x-dd, 2*y, z))) 

       [,1]   [,2]   [,3]   [,4]   [,5]   [,6] 
[1,] -0.3333333+0i -0.2450296+0i -0.1722534-0i -0.1088933-0i -0.05203037+0i 0.000000+0i 
[2,] -1.0000000+0i -1.0883037+0i -1.1610799+0i -1.2244400+0i -1.28130296+0i -1.333333+0i 
+0

+1代數技能。 – 2012-07-16 16:12:37

+0

謝謝。 :)我想我需要刷上我的代數。 – TrueWheel 2012-07-16 16:16:00

2

你有

d2 = x + 2 C1 y + C1^2 z 

,你可以重新排列,或者只是將其插入Wolfram Alpha得到

z C1^2 + 2 y C1 + x - d2 = 0 

這是C1,它可以解決或者使用二次公式quadratic equation得到

C1 = (-sqrt(d2 * z - x * z + y^2) - y)/z