作者celestialgod (攸蓝)
看板Statistics
标题Re: [问题]请问R能算反函数吗??
时间Mon Jun 29 16:56:24 2015
※ 引述《ya1357977889 (HSciverce)》之铭言:
: 请问一下 R能写反函数吗
: 如 y = 6*x^1/3 +3*x^4/3 +6 它的反函数怎麽用R找呢
: 应该说我有y值 需要求x值
: 网路上有找到类似的
: inverse = function (f, lower = -100, upper = 100) {
: function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]}
他其实是两层函数:
第一层:
function(f, lower, upper) 是input 你的function跟你要找根的范围(lower, upper)
第二层:
function(y) uniroot((function(x) f(x) - y), ...)
是在范围内找f(x) = y的x解
回传的是找到的x值 也就是f^(-1)(y)
: square_inverse = inverse(function (x) x^2, 0.1, 100)
所以此处square_inverse是一个function,input是 function(x) x^2
: square_inverse(4)
这就是计算x^2=4的x为多少
: [1] 1.999976
因为是根据uniroot算的,而uniroot是数值逼近的方法去求解
因此,答案不会是exact
uniroot会根据tolerance判断是否收敛
你的程式范例未指定,则依据不同机器给不同的值
要自己改的话,function建议可以改这样:
inverse = function(f, interval, ...){ function(y){
uniroot(function(x) f(x) - y, interval, ...)[1]
}} ## 此处的interval就是上面的lower跟upper
square_inv = inverse(function(x) x^2, interval = c(0, 100), tol = 1e-10)
# interval, tol可以自己设定
square_inv(4) # 2
square_inv = inverse(function(x) x^2, interval = c(0, 100), tol=1e-3)
square_inv(4) # 1.999975
## in your case
funct_your_case = inverse(function(x) 6*x^1/3 +3*x^4/3 +6, interval = c(3,100))
funct_your_case(100) # 3.06176 # tol也可以不设定,就根据机器决定
: 但是有点看不太懂
: 如inverse(function (x) x^2, ""0.1, 100""<<<这是误差值吗
: 我把它改0.00001, 1000000 他答案就才等於2
: 另外因为套这个 再求x时 0附近会有ERROR
: 所以想问问大家R有反函数的程式吗 或是原理之类的
: 谢谢 mO__Om
其他方法的话 可以GOOGLE symbolic compuation in R
看看可不可以直接找出function的inverse function
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.248.7.74
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Statistics/M.1435568188.A.A96.html
※ 编辑: celestialgod (111.248.7.74), 06/29/2015 17:03:14
1F:推 memphis: 我记得R在这方面很弱 远不及matlab 不知道是不是错误印象 06/29 20:16
2F:→ memphis: 如果有人有经验的 能不能给点意见, 我还没看过类似的讨论 06/29 20:17
3F:→ memphis: 我在做 curve fitting 的时候遇到这议题, 弄得乱七八糟 06/29 20:19
4F:→ celestialgod: symbolic部份 r确实远远不及matlab 06/29 23:28
5F:→ celestialgod: 看会不会用rcpp call sympy... 06/29 23:29