首页/文章/ 详情

基于函数式编程思想的有限元编程(二)

15天前浏览430

 

基于函数式编程思想的有限元编程(一)

本文主要探讨纯函数与不可变。

要将一个函数定义成纯函数,当且仅当:

  • • 输入相同时,输出始终相同
  • • 没有副作用

C++语言有一个经典的交换函数swap

  void swap(int& a, int& b){
    int temp = a;
    a = b;
    b = temp;
}

int main(){
    int a = 5;
    int b = 10,
    swap(a, b);
    // 现在a的值为10,b的值为5
    return 0;
}

当该函数修改函数体以外的数据,或者修改函数的输入时,就会产生副作用。

Python定义一个纯函数

  def func_pure(p,q):
    u = q['x'] - p['x']
    v = q['y'] - p['y']
    return{'u':u,'v':v}

point1 = {'x':10,'y':20}
point2 = {'x':12,'y':20}
func_pure(point1,point2)

给定相同的输入点point1和point2,返回值总是相同,并且在函数体之外的任何东西都没有被修改。相比之下,以下代码是“不纯”版本:

  last_point = {'x':10,'y':20}

def func_impure(q):
    u = q['x'] - last_point['x']
    v = q['y'] - last_point['y']
    new_vector = {'u':u,'v':v}
    last_point = q
    return new_vector

这个代码使用last_point的共享状态,该状态在每次调用时都会改变。这种改变是该函数的一个副作用。函数返回的向量依赖于last_point的共享状态,因此对相同的输入点,该函数不会返回相同的向量。这种现象在多线程编程很常见。

上面的讨论对不可变有了初步印象,如果某样东西不随时间变化那么它就是不可变的。如果决定以函数式编程的方式编写代码,我们必须避免可变数据,使用纯函数对程序进行建模。假设,我们使用字典在平面上定义了一个点P和向量v,如果想计算P沿着向量移动后所生成的点,我们可以用函数式编程的方式,用函数创建一个新点。示例如下:

  def displaced_point(point,vector):
    x = point['x'] + vector['u']
    y = point['y'] + vector['v']
    return{'x':x, 'y':y}

point = {'x':10,'y':20}
vector = {'x':12,'y':20}
new_point = displaced_point(point,vector)

这个函数是纯函数。给定相同的点和向量作为输入参数,得到的位移点总是相同,而且函数处理的数据没有任何改变,也包括函数参数。

与之相反,非函数式编程的解决方法可能需要使用如下函数来改变原来的点:

  def displaced_point(point,vector):
    point['x'] += vector['u']
    point['y'] += vector['v']
    

这个函数修改了作为参数输入的point,违反了函数式编程的关键规则。

函数式风格的一个重要优点是,通过恪守数据结构的不可变性,我们可以避免意料之外的副作用。当修改某个对象时,你可能并不知道代码中引用该对象的所有位置。如果有其他部分代码依赖于该对象的状态,就可能出现难以预料的副作用。因此,在对象发生改变之后,程序的行为可能与预期的不同。这类错误非常难发现,甚至可能需要数小时的调试。

在项目中尽量减少可变对象的数量,可以使其更可靠,更不容易出错。

 


来源:数值分析与有限元编程
python
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-05-30
最近编辑:15天前
太白金星
本科 慢慢来
获赞 12粉丝 24文章 346课程 0
点赞
收藏
作者推荐

力学概念| 减震的力学原理

减震技术主要是指在结构的一些部位加上一定数量的阻尼装置或者其他消能部件,为结构提供一定的附加阻尼与刚度以及增大结构自振周期,从而消耗掉外部地震产生的能量,减轻结构动力响应。地震效应如何作用到结构上 ▲图1图1所示一单自由度体系受地震的动力作用。设基础的水平动位移为 ,质量m对于基础的相对位移为 ,则质量 的总水平位移为 。作用于质量上的惯性力是由其总位移加速度所决定的,为 ,而弹性恢复力和阻尼力仍是由其相对位移和相对速度决定的。于是,可由动平衡条件得运动方程为记 式中, 为质点的质量, 分别为质点相对于地面的位移、速度和加速度, 为结构的恢复力, 为地面加速度。将式(2)与单自由度体系运动的一般方程比较可知,地基运动产生的动力效应就相当于在质量上施加一动力荷载。减震的力学原理以单自由度体系为例,简单介绍消能减震结构的工作原理。将式(2)两边同时乘以 ,并从 积分得式中, 代表系统的动能; 代表系统的阻尼耗能, 代表地震作用输入到系统中的总能量, 代表系统的变形能,由弹性变性能 、塑性变性能 以及滞回耗能 三部分组成,即式(4)即为地震作用下的结构振动能量平衡方程。地震结束后,结构停止振动,对应质点的速度和加速度均为 ,且结构的弹性变形恢复,故结构的动能 和弹性应变能 等于 ,因此能量方程(4)成为从(6)可以看出,输入到结构中的地震能量 最终由结构阻尼耗能 、塑性变形能 和滞回耗能 三部分耗散。因此从能量观点来看,只要结构在地震作用下提供阻尼耗能、塑性变形耗能和滞回耗能的能力大于地震输入能量 ,结构即可有效抵抗地震作用,不会倒塌。一般抗震结构的阻尼耗能能力较小,当地震作用超过结构的承载力时,将主要依靠结构自身的塑性变形耗能和滞回耗能能力来耗散地震输入能量,从而导致结构的损伤和破坏,当损伤过大时将引起结构的倒塌。因此,为使结构满足大震不倒的设计目标,关键是要保证等式左边的结构耗能能力大于右边的地震能量需求。要么减小地震输入给结构的能量,要么增加等式左边的结构耗能能力。这两种途径分别对应于隔震设计和消能减震设计。 ▲图2图2(a)和2(b)从工程设计中常用的拟加速度反应谱的角度分别说明了隔震结构和消能减震结构的基本原理。隔震结构通过设置隔震层,延长上部结构的周期,如将结构周期从隔震前的 延长到隔震后的 ,根据设计地震的拟加速度反应谱,结构所承担的地震力显著降低。消能减震结构通过设置消能器,不显著改变结构周期而显著增加结构的阻尼,如将结构的阻尼比从设置消能器前的 增加到设置消能器后的 ,从而显著降低结构所承受的地震力单自由度体系消能减震结构中设置了黏滞消能器(只增加结构的阻尼,不增加结构刚度),其所提供的恢复力为 ,在地震作用下的振动方程为采用上述同样的方法,地震结束时的能量平衡方程如下:式中, 为消能减震装置的耗能。由于一般情况下增设消能器不显著改变结构的自振周期,在同样的地震作用下,附加消能器对结构的地震输入能量 没有显著的影响。与式(6)相比,式(8)的耗能能力增加了 项,从而使得原主体结构的塑性变形耗能和滞回耗能需求减少,减轻了主体结构的损伤程度,甚至无损伤。来源:数值分析与有限元编程

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