楼主: peijianshi
8277 10

[问答] R中如何提高计算的精度? [推广有奖]

  • 0关注
  • 16粉丝

已卖:352份资源

副教授

80%

还不是VIP/贵宾

-

威望
0
论坛币
638 个
通用积分
2.3662
学术水平
12 点
热心指数
12 点
信用等级
5 点
经验
15373 点
帖子
636
精华
0
在线时间
568 小时
注册时间
2010-3-11
最后登录
2022-9-8

楼主
peijianshi 发表于 2016-7-19 11:54:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近遇到一个棘手的问题,本来应该是一个光滑的函数,但是由于R自身运行的精度不高,导致出现的曲线不光滑。

如果提高R内在运行的精度呢?

注意:我不是说打印出来的精度,而是指R程序运行的内在精度。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何提高 R程序 如何

R万岁!

沙发
prunusis 发表于 2016-7-19 12:31:53
你知道r是什么精度吗

藤椅
马甲1号 发表于 2016-7-19 13:07:39
R默认的double精度正常情况下应该够用了,感觉是你算法有问题。

板凳
peijianshi 发表于 2016-7-19 15:12:59
  myfun <- function(P, y){
    ropt <- P[1]
    topt <- P[2]
    tmin <- P[3]
    tmax <- P[4]
    fun0 <- function(x){
      x[x < tmin] <- tmin
      x[x > tmax] <- tmax
      return(x)
    }
    y <- fun0(y)
    temp1 <- (ropt*(-(y-tmin)^3*(2*tmax+tmin-3*topt)^3+3*(y-tmin)^2*(2*tmax+tmin-3*topt)^2*(tmax-topt)^2-
      6*(y-tmin)*(2*tmax+tmin-3*topt)*(tmax+tmin-2*topt)*(tmax-topt)^2*(tmin-topt)
      +6*(tmax+tmin-2*topt)^2*(tmax-topt)^2*(tmin-topt)^2*log(y*(2*tmax+tmin-3*topt)+2*topt^2
      -tmax*(tmin+topt))))/( 3*(2*tmax+tmin-3*topt)^4*(-tmin+topt) )
    z     <- tmin
    temp2 <- (ropt*(-(z-tmin)^3*(2*tmax+tmin-3*topt)^3+3*(z-tmin)^2*(2*tmax+tmin-3*topt)^2*(tmax-topt)^2-
      6*(z-tmin)*(2*tmax+tmin-3*topt)*(tmax+tmin-2*topt)*(tmax-topt)^2*(tmin-topt)
      +6*(tmax+tmin-2*topt)^2*(tmax-topt)^2*(tmin-topt)^2*log(z*(2*tmax+tmin-3*topt)+2*topt^2
      -tmax*(tmin+topt))))/( 3*(2*tmax+tmin-3*topt)^4*(-tmin+topt) )
    temp3 <- temp1-temp2
    return(temp3)

  }


x <- seq(0, 100, len=2000)

par <- c( 0.8004191, 59.2451616, 24.4516643, 76.6365741)

plot(x, myfun(par, x), type="l")


谢谢上述两位的讨论,我附上一个函数,这个函数有四个参数。方程式较为复杂,我猜想就是因为这个复杂方程影响了计算的精度,导致曲线不光滑,按照道理,上述曲线应该是光滑的。

谢谢你们继续讨论!




报纸
peijianshi 发表于 2016-7-19 15:15:41
你们稍微更改一下par中的任何一个值,稍微变化一下,就会出现一个光滑函数,为什么呢?

地板
jgchen1966 发表于 2016-7-19 20:26:45
请将函数myfun 最后的return(temp3),改为return(data.frame(t1=temp1,t2=temp2,t3=temp3))。。。瞧瞧t1,t2,t3各是啥数??我的计算结果是:

x <- seq(0, 100, len=2000)

par <- c( 0.8004191, 59.2451616, 24.4516643, 76.6365741)
yda<-myfun(par,x)
head(yda)
            t1           t2                     t3
1 2.519266e+15 2.519266e+15  0
2 2.519266e+15 2.519266e+15  0
3 2.519266e+15 2.519266e+15  0
4 2.519266e+15 2.519266e+15  0
5 2.519266e+15 2.519266e+15  0
6 2.519266e+15 2.519266e+15  0
tail(yda)
               t1           t2                      t3
1995 2.519266e+15 2.519266e+15 23.5
1996 2.519266e+15 2.519266e+15 23.5
1997 2.519266e+15 2.519266e+15 23.5
1998 2.519266e+15 2.519266e+15 23.5
1999 2.519266e+15 2.519266e+15 23.5
2000 2.519266e+15 2.519266e+15 23.5
summary(yda)
       t1                  t2                               t3      
Min.   :2.519e+15   Min.   :2.519e+15   Min.   :-0.50  
1st Qu.:2.519e+15   1st Qu.:2.519e+15   1st Qu.: 0.00  
Median :2.519e+15   Median :2.519e+15   Median : 7.00  
Mean   :2.519e+15   Mean   :2.519e+15   Mean   :10.47  
3rd Qu.:2.519e+15   3rd Qu.:2.519e+15   3rd Qu.:23.50  
Max.   :2.519e+15   Max.   :2.519e+15   Max.   :24.00  

7
jgchen1966 发表于 2016-7-19 20:36:46
temp1,temp2两个计算公式,是病态的。。。请用不同par值试,summary(yda),瞧结果!!!

8
jgchen1966 发表于 2016-7-19 20:45:20
如此复杂的数学公式计算,最好分段计算分段检查。。既使原公式是正确的,你也有很大可能性,“抄错”。。。。

9
prunusis 发表于 2016-7-20 04:23:18
library(gmp)
myfun <- function(P, y){
  P = as.bigq(P)
  y = as.bigq(y)
  ...
}

10
peijianshi 发表于 2016-7-24 15:59:25
jgchen1966 发表于 2016-7-19 20:45
如此复杂的数学公式计算,最好分段计算分段检查。。既使原公式是正确的,你也有很大可能性,“抄错”。。。 ...
谢谢,我确信公式没有抄错的。使用mathematica直接求积分得到的。原始的表达式是beta.fun那个函数。本来计划直接使用积分,而不求具体的函数表达式(因为太长了),但是在曲线拟合过程中(就是求那些参数ropt, topt, tmin, tmax),积分会出现异常,所以干脆求解积分后的表达式。

上述函数拟合过程中一般是正常的,但是也会出现曲线不光滑的现象。一时不知道如何办是好。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 17:47