求解R中的非线性方程组

时间:2018-02-16 18:19:10

标签: r equation-solving

假设我有以下方程组:

a * b = 5
sqrt(a * b^2) = 10

如何在R?

中解决a和b的这些方程式

我想这个问题可以说是一个优化问题,具有以下功能......?

fn <- function(a, b) {

    rate <- a * b
    shape <- sqrt(a * b^2)

    return(c(rate, shape) )

}

2 个答案:

答案 0 :(得分:5)

使用此库。

library("nleqslv")

您需要定义要解决的多变量函数。

fn <- function(x) {

  rate <- x[1] * x[2] - 5
  shape <- sqrt(x[1] * x[2]^2) - 10

  return(c(rate, shape))

}

然后你很高兴。

nleqslv(c(1,5), fn)

始终查看详细结果。数值计算可能很棘手。在这种情况下,我得到了这个:

Warning message:
In sqrt(x[1] * x[2]^2) : NaNs produced

这只是意味着程序搜索了一个包含x[1] < 0的区域,然后可能会将该区域反射回到飞机的右侧。

答案 1 :(得分:3)

在评论中,海报明确询问了如何使用from tkinter import * import time root = Tk() root.geometry('100x100+100+100') # size/position of root def callback(): # this function will run on button press print('Firing in 3') time.sleep(3) # wait for 3 seconds def main(): #function 'main' b = Button(root, text="ᖴIᖇE", width=10,height=2, command=callback)# setting the button b["background"] = 'red' #button color will be red b["activebackground"] = 'yellow' #button color will be yellow for the time when the button will not be released b.place(x=25,y=25) #placing the button main() # using function 'main' mainloop() solve,因此我们展示如何手动解决(1),(2)使用optim,(3)使用solve和(4)定点迭代。

1)手工首先请注意,如果我们根据第一个等式编写optim并将其替换为第二个等式,我们得到a = 5/b所以b = 20和a = 0.25。

2)求解关于sqrt(5/b * b^2) = sqrt(5 * b) = 10的使用,这些方程可以通过取两边的对数给出变换为线性形式:

solve

可表示为:

log(a) + log(b) = log(5)
0.5 * (loga + 2 * log(b)) = log(10)

3)优化使用m <- matrix(c(1, .5, 1, 1), 2) exp(solve(m, log(c(5, 10)))) ## [1] 0.25 20.00 我们可以在optim来自问题的地方写下来。通过减去方程的RHS并使用fn形成平方和来形成fn2

crossprod

,并提供:

fn2 <- function(x) crossprod( fn(x[1], x[2]) - c(5, 10))
optim(c(1, 1), fn2)

4)固定点为此,以固定点形式重写方程式,即以c(a,b)= f(c(a,b))的形式,然后迭代。一般来说,有几种方法可以实现这一点,但并非所有方法都会收敛,但在这种情况下,这似乎有效。我们对$par [1] 0.2500805 19.9958117 $value [1] 5.51508e-07 $counts function gradient 97 NA $convergence [1] 0 $message NULL a使用1的起始值,并将第一个等式的两边除以b,得到第一个以固定点形式出现的方程式,并将第二个等式划分为第二个等式方程式b得到固定点形式的第二个方程:

sqrt(a)