复杂计算最小值求解:R实现Goal Seek等效功能及数据框生成
解决方案
1. 寻找使wynik取值为2的最小n值
先封装计算wynik的核心逻辑为函数,再通过二分法查找满足条件的最小n值(模拟Excel的Goal Seek功能):
library(dplyr) # 封装计算wynik的函数 calculate_wynik <- function(n) { test <- data.frame(used = c(1.545, 0.125, 0.0548), product = c(3.56, -1.589, 0.878)) test <- test %>% mutate( product.scale = n * product, p.diff = used - product.scale ) nrow(test[test$p.diff > 0, ]) } # 二分法查找最小n值 find_min_n <- function(target_wynik = 2) { left <- 0 right <- 1.545 / 3.56 # 第一行p.diff=0时的n值,作为右边界 # 迭代缩小区间,直到精度足够 while (right - left > 1e-8) { mid <- (left + right) / 2 current_wynik <- calculate_wynik(mid) if (current_wynik == target_wynik) { right <- mid # 尝试更小的n } else { left <- mid # n过小,增大左边界 } } return(right) } # 运行得到结果 min_n <- find_min_n() cat("使wynik=2的最小n值:", round(min_n, 6), "\n")
运行后会得到临界值≈0.062415,当n大于等于这个值时,wynik首次变为2。
2. 生成指定n集合对应的wynik结果表
直接遍历指定n集合,批量计算并生成data.frame:
# 指定n值集合 n_values <- c(1, 2, 2.5, 2.8, 3.7) # 批量计算每个n对应的wynik wynik_values <- sapply(n_values, calculate_wynik) # 生成结果数据框 result_df <- data.frame(n = n_values, wynik = wynik_values) print(result_df)
运行后输出的结果类似:
n wynik 1 1.0 1 2 2.0 1 3 2.5 1 4 2.8 1 5 3.7 1
(这些n值都大于第一行的临界值≈0.434,所以只有第二行的p.diff始终为正,wynik=1)
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

