You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出使R函数所有输出低于阈值的s1与s2组合?

解决思路与实现代码

核心条件推导

你的函数输出是 s1[j]*s2[j] + z1[i],要让所有输出都小于阈值(比如20),本质只需要满足**s1*s2 + max(z1) < 阈值**。因为z1的最大值是8,代入阈值20的话,就是s1*s2 < 12——只要这个条件成立,所有z1对应的输出都会小于20(其他z1元素更小,加起来的结果肯定也更小)。反过来,如果这个条件不满足,那至少有一个输出(z1取最大值时)会超过阈值。

这个推导能大幅减少计算量,不用生成整个矩阵再逐一判断。

具体实现步骤

  1. 生成所有(s1, s2)组合:用expand.grid()生成s1和s2的全部配对
  2. 筛选符合条件的组合:用推导的条件直接过滤
  3. 可选:优化原函数:用向量化操作替代嵌套循环,提升运行效率

代码示例

基础筛选代码

# 定义变量
z1 <- c(2, 4, 6, 8)
s1 <- seq(-13, 14, by = 0.1)
s2 <- seq(-13, 14, by = 0.1)
threshold <- 20

# 生成所有s1和s2的组合
all_pairs <- expand.grid(s1 = s1, s2 = s2)

# 计算判断条件,筛选有效组合
max_z <- max(z1)
valid_pairs <- all_pairs[all_pairs$s1 * all_pairs$s2 < (threshold - max_z), ]

valid_pairs就是所有符合要求的(s1, s2)组合,你可以直接查看或后续使用。

优化原函数(可选)

原函数的嵌套循环可以用向量化的outer()函数替代,效率更高:

Function <- function(s1, s2) {
  outer(s1 * s2, z1, `+`)
}

若需基于函数输出判断(复杂场景)

如果z1的情况更复杂,无法通过最大值简化条件,可以用以下方式基于函数输出筛选:

# 先获取所有组合的s1、s2向量
s1_vec <- all_pairs$s1
s2_vec <- all_pairs$s2

# 调用函数生成输出矩阵
Y <- Function(s1_vec, s2_vec)

# 判断每一行的所有元素是否都小于阈值
valid_indices <- apply(Y, 1, function(row) all(row < threshold))

# 筛选有效组合
final_valid_pairs <- all_pairs[valid_indices, ]

这种方法效率较低,仅推荐在无法简化条件时使用。

内容的提问来源于stack exchange,提问作者Blue999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:42:41