请帮我优化以下代码:#定义函数f(x)# fun<-function(x){ return(x^5+3*x^4) } #计算一到七阶牛顿-科特斯公式# newton_cotes<-function(fun,a,b,n){ #计算等分点距离 h=(b-a)/n if(n==1){ #一阶牛顿—科特斯公式 return(n*h*(fun(a)+fun(b))/2) } else if(n==2){ #二阶牛顿—科特斯公式 return(n*h*(fun(a)+4*fun(a+h)+fun(b))/6) } else if(n==3){ #三阶牛顿—科特斯公式 return(n*h*(fun(a)+3*fun(a+h)+3*fun(a+2*h)+fun(b))/8) } else if(n==4){ #四阶牛顿—科特斯公式 return(n*h*(7*fun(a)+32*fun(a+h)+12*fun(a+2*h)+32*fun(a+3*h)+7*fun(b))/90) } else if(n==5){ #五阶牛顿—科特斯公式 return(n*h*(19*fun(a)+75*fun(a+h)+50*fun(a+2*h)+50*fun(a+3*h) +75*fun(a+4*h)+19*fun(b))/288) } else if(n==6){ #六阶牛顿—科特斯公式 return(n*h*(41*fun(a)+216*fun(a+h)+27*fun(a+2*h)+272*fun(a+3*h) +27*fun(a+4*h)+216*fun(a+5*h)+41*fun(b))/840) } #七阶牛顿—科特斯公式 return(n*h*(751*fun(a)+3577*fun(a+h)+1323*fun(a+2*h)+2989*fun(a+3*h) +2989*fun(a+4*h)+1323*fun(a+5*h)+3577*fun(a+6*h)+751*fun(b))/17280) #输入n无效 return("输入n值错误,请输入范围为(1-7)的整数") }
时间: 2023-06-17 11:07:53 浏览: 128
下面是优化过的代码:
```
# 定义函数f(x)
fun <- function(x) {
return(x^5 + 3*x^4)
}
# 计算牛顿-科特斯公式
newton_cotes <- function(fun, a, b, n) {
if (n < 1 || n > 7 || !is.integer(n)) {
return("输入n值错误,请输入范围为(1-7)的整数")
}
# 计算等分点距离
h <- (b - a) / n
# 计算权重
weights <- switch(n,
1, c(1, 1),
2, c(1, 4, 1),
3, c(1, 3, 3, 1),
4, c(7, 32, 12, 32, 7),
5, c(19, 75, 50, 50, 75, 19),
6, c(41, 216, 27, 272, 27, 216, 41),
7, c(751, 3577, 1323, 2989, 2989, 1323, 3577, 751))
# 计算节点
nodes <- seq(a, b, length.out = n+1)
# 计算积分
integral <- sum(weights * fun(nodes)) * h / n
return(integral)
}
```
优化过的代码使用了 `switch` 函数来避免多个 if-else 语句,同时使用了向量化来避免循环。另外,对于不合法的输入,函数会返回一个错误信息。
阅读全文