2012-07-16 91 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