【问题标题】:Writing a function in R to solve Plank's equation在 R 中编写一个函数来求解普朗克方程
【发布时间】:2021-12-28 02:33:38
【问题描述】:

我正在尝试在 R 中编写我的第一个函数,以使用 Plank 函数在不同温度下计算发射率。对于 200 到 310 K 的温度,我可以手动执行如下操作。

pi <- 3.141593
h <- 6.626068963e-34
c <- 2.99792458e+8
lambda <- 4 * 1e-6
k <- 1.38e-23
t <- c (200:310)
a <- (2*pi*(c^2)*h)/(lambda^5)
b <- exp((h*c)/(lambda*k*t))
B <- a * (1/(b-1))

其中 B 是我想要的值的向量。

现在努力在 R 中编写一个函数:

P_function <- function(t, pi = 3.141593, h = 6.626068963e-34, c = 2.99792458e+8,
             lambda = 4 * 1e-6, k = 1.38e-2) {
         ((2*pi*(c^2)*h)/(lambda^5)) *((1/(exp((h*c)/(lambda*k*t))-1)))
}

现在对于不同的t值(200-300K),我该如何实现这个功能?

【问题讨论】:

    标签: r function equation


    【解决方案1】:

    几个问题。首先,pi 已经是一个定义的常数,其精度比您使用的要高。

    > rm(pi)  # remove your copy
    > pi
    [1] 3.141593   # default for console printing is  only 8 digits
    > print(pi, digits=18)
    [1] 3.14159265358979312  # but there is more "depth" to be had
    

    其次,将科学常数放在参数列表中是没有意义的。由于它们是恒定的,因此它们可以在正文中定义。参数列表适用于可能因情况而异的项目。

    newPfun <- function(t) { h <- 6.626068963e-34
       c <- 2.99792458e+8
       lambda <- 4 * 1e-6
       k <- 1.38e-23
       a <- (2*pi*(c^2)*h)/(lambda^5)   #pi is already defined
       b <- exp((h*c)/(lambda*k*t))
       B <- a * (1/(b-1))
     return(B) }
    

    这只是您“打包”以接受温度向量的原始代码。 (而且我很确定科学家的名字拼写不正确。)

    不确定您的第二个功能在哪里存在缺陷。也许是不匹配的括号。在尝试使用单个表达式复制结果并多次失败后,我现在想知道这是否真的是数值溢出(或下溢)的问题。

    【讨论】:

    • c(R 中最基本的函数之一)重新定义为光速是一个坏主意。也许是C
    • 嘿,虽然我当然同意 c 不是数据对象的好名字,但您不是“重新定义 c”,因为数据对象和函数存储在不同的列表中。此外,C 也是一个函数名称,因此如果您决定遵循自己的明智建议以避免将现有函数名称用于数据对象,那么这并不是特别明智的做法。当其他用户使用df 作为数据对象的名称时,您是否也会提醒他们。它也是一个函数名。
    • 实际上,是的,出于同样的原因,我告诉人们避免使用df 作为变量。但我不知道函数C,因为它比c 鲜为人知。
    • @Brian 所以你不应该告诉人们创建数据对象是重新定义现有功能。只有将现有的函数名称分配给新的函数对象时,才会有屏蔽。数据分配的主要缺点是代码变得更难阅读并且错误消息变得混乱。 (如果您尝试纠正所有使用df 作为数据对象名称的人,您将成为一个非常忙于评论的人。我曾经这样做,但现在通常只在我的工作中使用“dfrm”。)
    猜你喜欢
    • 2020-05-31
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多