提问人:BananaPotatoPower 提问时间:9/21/2023 最后编辑:Chayim FriedmanBananaPotatoPower 更新时间:9/22/2023 访问量:47
有没有办法创建一个闭包来计算 Rust 中具有随机系数的 n 次多项式?
Is there a way to create a closure that computes an nth degree polynomial with random coefficients in Rust?
问:
因此,我们的想法是有一个函数,该函数返回具有随机系数的 n 度闭包。这对于比较根查找方法可能很有用,例如,我们可以自动创建要计算的函数。 将任何操作附加到关闭的返回中将是一个更强大的资源,所以如果有办法做到这一点,请告诉我。
代码应如下所示:
use rand::Rng;
fn create_func(n: u8) -> impl Fn(f64) -> f64 {
let mut cst = vec![];
for _ in 0..n{
cst.push(rand::thread_rng().gen_range(0..=20) as f64);
// establish the coefficients by randomly generating them
}
move |x| cst[0]*x + cst[1]*x.powf(1.) + /*...*/ cst[n- 1]*x.powf(n as f64)
}
所以很明显,最后一部分并不是表达我们想要返回的其余闭包的有效方式,但我希望你能明白。
答:
2赞
drewtato
9/21/2023
#1
你正在寻找一个总和,所以把你的序列变成一个将被求和的迭代器。
move |x| {
cst.iter()
.zip(0..=n as i32)
.map(|(&c, exp)| c * x.powi(exp))
.sum()
}
对于每个项目,您需要 from () 及其指数 () 的元素。您可以从这些项 () 中一次构造一个项,然后将所有项相加 ()。cst
iter
zip
map
sum
我还修复了您的术语数量(您的术语没有 x^0 术语)并使用,这比每次调用都快。我已经切换到,因为所有的指数都是整数。sample_iter
thread_rng
powi
pub fn create_func(n: u8) -> impl Fn(f64) -> f64 {
let cst: Vec<f64> = rand::thread_rng()
.sample_iter(rand::distributions::Uniform::new_inclusive(0, 20))
.map(|n| n as f64)
.take(n as usize + 1)
.collect();
move |x| {
cst.iter()
.zip(0..=n as i32)
.map(|(&c, exp)| c * x.powi(exp))
.sum()
}
}
评论
2赞
cafce25
9/21/2023
您可以代替重用 ..enumerate()
n
0赞
drewtato
9/21/2023
我留在那里是为了展示它对应什么。另外,当我不需要 .n
enumerate
usize
1赞
cafce25
9/21/2023
啊,但是imo,很容易因为一个错误而犯错(例如忘记),并完全避免这个错误。此外,无论如何您都必须强制转换,因为一开始就不是正确的类型。=
enumerate
n
1赞
drewtato
9/21/2023
另一种选择是没有这些问题。zip(0..)
0赞
cafce25
9/22/2023
除了仍然差一个,(诚然这是一个罕见的错误,但在从数学中翻译算法时并非闻所未闻)zip(1..)
1赞
hkBst
9/21/2023
#2
多项式的其他表达方式如下:
P_fold_n(x) = (…(((x + a_1) * x + a_2) * x + a_3)…) * x + a_n
和
P_map_n(x) = (x + a_1) * (x + a_2) * (x + a_3) … * (x + a_n)
这导致了以下实现:
fn poly_via_fold(coeffs: Vec<f64>) -> impl Fn(f64) -> f64 {
move |x: f64| coeffs.iter().fold(1.0, |res, a| res * x + a)
}
fn poly_via_map(coeffs: Vec<f64>) -> impl Fn(f64) -> f64 {
move |x: f64| coeffs.iter().map(|a| x + a).product()
}
评论
0赞
cafce25
9/22/2023
该方法不计算等效政治值,它的大小不同!但是,人们可以生成不同的系数或从原始系数中计算它们以保持等价性。P_map_n
0赞
hkBst
9/22/2023
@cafce25,我认为你的意思是说我的代码中使用的系数与你得到的系数不同,这是真的。但是,如果你的系数无论如何都是随机的,那么你可能不太关心系数的含义。P(x) = a_0 + a_1 x + a_2 x^2 ... x^n
0赞
cafce25
9/22/2023
如果它们真的是完全随机的,是的,但这不是一回事,OP 生成了具有特定分布的系数,您可以更改该系数。这可能是可以接受的,也可能是不可接受的。P_map_n
评论