首页 > 解决方案 > 求解 R 中的复杂方程

问题描述

我有一个方程,比如 a、b、c 和 d 是常数:

(b/(4.24 10^-11)) (1-2*x) + log(x/(1-x)) - log((a/(1-a))*c/d)) = 0

如何在 R 中求解这个方程以找到 x?

标签: r

解决方案


1)假设常数都等于 0.1 并且解方程的 x 的值介于 0.1 和 .9 之间,我们有:

f <- function(x, a, b, c, d) (b/(4.2410^-11))*(1-2*x) + 
  log(x/(1-x)) - log((a/(1-a))*c/d)
uniroot(f, c(0.1, 0.9), a = .1, b = .1, c = .1, d = .1)
str(ans)

给予:

List of 5
 $ root      : num 0.5
 $ f.root    : num -8.54e-07
 $ iter      : int 2
 $ init.it   : int NA
 $ estim.prec: num 6.1e-05

我们可以像这样绘制它:

curve(f(x, .1, .1, .1, .1), 0.1, 0.9)
abline(v = ans$root, h = ans$f.root)

截屏

2)另一种可能性是重新排列方程以给出:

x = (+1+(log(x/(1-x)) - log((a/(1-a))*c/d)) / (b/(4.2410^-11)))/2

然后迭代它。请注意,它立即收敛。

a <- b <- c <- d <- 0.1
x <- 0.25
for(i in 1:10) print(
    x <- (+1+(log(x/(1-x)) - log((a/(1-a))*c/d)) / (b/(4.2410^-11)))/2
  )

给予:

[1] 0.5000007
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014
[1] 0.5000014

推荐阅读