近期在数值分析中学习了非线性方称求根方法中的“二分法查找”,考虑用R语言实现。
例题是参考的【数值分析】二分法求方程的根(附matlab代码)_matlab二分法求方程根的程序-优快云博客
(侵删)
自编二分法查找函数的代码:
Bisecfunc <- function(funcexp, low, up, w = 0.001, n_max = 1000){
f_1 = funcexp(low) # 左边界函数值
f_2 = funcexp(up) # 右边界函数值
n = 0 # 迭代次数
while(f_1 * f_2 != 0){
if (f_1 * f_2 > 0){
cat("提供的初始区间不包含零点")
}else{
mid = (low + up)/2 # 中点
n = n + 1 # 进行了一次迭代,迭代次数加1
result = f_1 * funcexp(mid)
if (result == 0){
cat("迭代停止!\n","零点在:", mid, "\n", "共迭代:", n, "次")
break # 终止迭代
}else{
if (result < 0){
up = mid # 更新上端点
}else{
low = mid # 更新下端点
}
}
if (abs(up - low) < w){ # 满足误差要求, 停止迭代
cat("迭代停止!\n","找到满足近似解的x为:", mid, "\n", "共迭代:", n, "次")
break
}
}
if ( n > n_max){
cat("已经达到最高迭代次数",n_max, "\n", "当前找到的x的值为:", mid)
break
}
cat("已经迭代次数:", n, "\n")
}
}
例题1:找x^2 - x - 1 = 0的根,初始区间为0,1,要求根有三位小数
# 自定义目标函数
myfunc1 <- function(x_value){
out = x_value**2 - x_value - 1
return(out)
}
Bisecfunc(myfunc1, 1, 2, 0.05) # 调用自定义的二分法求根函数
运行结果:
例题2:
用二分法求方程 e^x + 10 ∗ x − 2 = 0的根,要求根有3位小数。
# 自定义函数
myfunc2 <- function(x_value){
out = exp(x_value) + 10 * x_value - 2
return(out)
}
# 调用二分法求根函数
Bisecfunc(myfunc2, 0, 1, 0.0005)
运行结果:
PS:目前这个函数在迭代次数统计等方面还有一些细节问题,欢迎指正交流~