我正在尝试解决R中以下函数的反问题。
x + 2 (C1 * y) + C1 * C1 * z = d2
我现在可以输入C1
并获取d2
,但需要输入d2
并获取C1
。变量x
,y
和z
都是已知的,永远不会改变。
我已经使用了一些已知的C1
和d2
值。
C1 d2
5 0.000316
0 0.000193
-5 0.000123
是否有R
函数允许我输入函数,之前的结果和d2
值,并返回C1
系数?
答案 0 :(得分:6)
你有一个二次方程式:
(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
答案 1 :(得分:2)
你有
d2 = x + 2 C1 y + C1^2 z
你可以重新排列以获得
z C1^2 + 2 y C1 + x - d2 = 0
这是C1中的quadratic equation,您可以使用二次公式解决,或者只需将其插入Wolfram Alpha即可获得
C1 = (-sqrt( d2 * z - x * z + y^2 ) - y) / z