首页/文章/ 详情

Rust语言尝鲜

7月前浏览6420

首先,还是要吹捧一下这个编程语言。语法很严谨,Rust语言号称只要编译通过就不会崩溃(内存安全)。不像C++那种,概念混乱,连Bjarne Stroustrup都曾开玩笑说自己已经搞不懂C++了。而且一个报错信息就一万多行,然后必须是大师级的程序员,精通 Intel规范的汇编语言的那种C++程序员,才能搞清楚什么地方出了问题。个人认为Rust对于程序员的综合素质要求,是低于C++的。所以笔者决定将Rust作为首选。

下面牛刀小试一把。以函数式编程方式,计算数值积分。以定积分

 

为例。该积分精确值为-6.75.如果将积分区间500等分,计算结果为-6.723,相对误差为0.4%。Python以及C++编程实现点击这里:

函数式编程计算数值积分

Rust代码

fn main() {
    let  steps = 500// 区间500等分
    let a:f64 = 0.0;
    let b:f64 = 3.0;
    let dx = (b-a)/(steps as f64); //每个区间长度,注意整型变量显式转化成浮点型
    let f = | x:f64 | {
    x*x*x - 6.0*x
    }; //闭包,相当于匿名函数,这里定义的是被积函数

    let sub_area = | x:f64 | {
        f(x)*dx
    };//一个子区间的面积,还调用了被积函数

    let  res = (0..steps).map(|x| ( (x as f64)+1.0 )*dx ).map(|x| sub_area(x) ).sum::<f64>();
    println!("结果为:{}", res)

}

程序中计算res的部分相当于C++里面的管道操作符。将{0,1,2,3,4,5,...,500}通过第一个map映射成每一个子区间中点,而第二个map就是通过子区间中点计算每一个子区间的面积。最后通过sum()函数累加起来。

Python入门容易,想要提高却很难。有一些机器学习的Python代码,很难理解。在学习一些底层语言比如C++,Rust之后,再去思考,就会容易一些了。

比如下面的问题:

use std::io::stdin;
fn main() {
    println!("What is 3+2? Type your answer and press enter.");
    let mut input = String::new();//字符串变量
    stdin()
    .read_line(&mut input)
    .expect("Unable to read standard input");
    if input == "5" {
        println!("Correct!");
    } else {
        println!("Incorrect!");
    }
}

键盘输入5,并由input接收,正常情况下input == "5"没毛病。可最后却输出"Incorrect!",为什么?原来我们在输入时按了enter键,\n意味着换行。

use std::io::stdin;
fn main() {
    println!("What is 3+2? Type your answer and press enter.");
    let mut input = String::new();//字符串变量
    stdin()
    .read_line(&mut input)
    .expect("Unable to read standard input");
    if input.trim() == "5" {
        println!("Correct!");
    } else {
        println!("Incorrect!");
    }
}

用trim方法将input多余的去掉,最后输出"Correct!"


来源:数值分析与有限元编程
STEPSpythonUM管道
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-03
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 10文章 321课程 0
点赞
收藏
作者推荐

中心差分法解动力学方程

01 算法分析 将位移按照泰勒公式展开,得到前差分公式: 同样可得向后差分公式: 以上两式相减和相加分别得到: 以上两式忽略高阶小量,可得到 时刻速度和加速度表达式: 为了求解 时刻的位移,将 代入 时刻动力学方程 得到 其中 若已经求得 和 时刻的位移 和 ,则可以从 求得 时刻的位移。由 可知,只给定初值 和 不能求出 ,还必须确定 ,即该方法存在如何起步的问题。在向后差分公式 中取 得 其中 和 由初值条件给出。而 则由 求得。中心差分法解动力学方程的算法可归纳为(一)初始计算形成刚度矩阵 ,质量矩阵 和阻尼矩阵 由初值 和 求解 和 由时间步长 计算计算 计算有效质量矩阵 对 进行分解 (二) 对每一时间步计算 时刻的有效载荷解 时刻位移 如果需要,按照 计算 时刻的速度和加速度02 算例 用中心差分法解运动方程,时间步长 其中 初始条件 将初始条件代入方程,解得 每个时间步长计算 以及 03 编程实现 # 中心差分法# @表示矩阵乘法import numpy as npimport matplotlib.pyplot as pltstep = 10 #求解步数data = np.zeros( (2,step) ) # 存储各时间步长的数据K = np.mat(&#39;6,-2;-2,4&#39;)M = np.mat(&#39;2,0;0,1&#39;)Q = np.mat(&#39;0;10&#39;)a_0 = np.zeros((2,1))velocity_0 = np.zeros((2,1))# 求初始加速度acceleration_0 = np.linalg.inv(M) *(Q - K @ a_0)dt = 0.28c0 = 1/(dt**2)c1 = 0.5 * dtc2 = 2 * c0c3 = 1 / c2a_dt = a_0 - dt * velocity_0 + c3 * acceleration_0# 有效质量矩阵MM = c0 * MinvMM = np.linalg.inv(MM)TMP1 = K - c2*M A_t_sub_dt = a_dtA_t = a_0 A_t_plus_dt = np.zeros((2,1))for i in range(step): TMP2 = M @ A_t_sub_dt QQ = Q - TMP1 @ A_t - c0 * TMP2 A_t_plus_dt = invMM @ QQ data[0:,[i] ] = A_t_plus_dt A_t_sub_dt = A_t A_t = A_t_plus_dt#解线性方程组采用求逆的方法,计算规模大的,可以用LDLT分解.#time = np.zeros((step))for i in range(step): t = 0.28 * (i+1) time[i] = tlabels =[&#39;Δt&#39;,&#39;2Δt&#39;,&#39;3Δt&#39;,&#39;4Δt&#39;,&#39;5Δt&#39;,&#39;6Δt&#39;,&#39;7Δt&#39;,&#39;8Δt&#39;,&#39;9Δt&#39;,&#39;10Δt&#39;]fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(5,12) )ax1.plot(time, data[0, :], &#39;r-&#39;)ax1.set_xticks(time, labels)ax1.set_ylabel(&#39;$a_1$&#39;,fontsize = 14)ax2.plot(time, data[1, :], &#39;b-&#39;)ax2.set_xticks(time, labels)ax2.set_ylabel(&#39;$a_2$&#39;,fontsize = 14)fig.savefig(&#39;./f429.png&#39;, dpi = 400) plt.show()来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈