首页/文章/ 详情

用感知机打开智能计算力学的大门

57分钟前浏览1

 

感知机

如图1所示的逻辑与的真值表,其输出只有0和1两种。感知机作为神经网络(深度学习)的起源的算法,功能上与之类似。

▲图1

感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或水管中的水那样具备“流动性”的东西。水管中的水可多可少。但是,和实际的水流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。在本文中,0对应“不传递信号”,1对应“传递信号”。

▲图2

图2是一个接收两个输入信号的感知机的例子。  是输入信号,  是输出信号,  是权重。图中的圆圈称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重  。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号  表示。总结起来,就是

感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用,就像水管的阀门。也就是说,权重越大,对应该权重的信号的重要性就越高。

下面考虑用感知机来表示逻辑与。需要做的就是确定能满足图1的真值表的  的值。那么,设定什么样的值才能制作出满足图1的条件的感知机呢?  时,可以满足图1的条件。此外,当取  或者  时,同样也满足与门的条件。设定这样的参数后,仅当    同时为1时,信号的加权总和才会超过给定的阈值  

用python实现逻辑与

  def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if
 tmp <= theta:
        return
 0
    elif
 tmp > theta:
        return
 1

这里决定感知机参数的并不是计算机,而是我们人。我们看着真值表“训练数据”,人工想到了参数的值。而机器学习的课题就是将这个决定参数值的工作交由计算机自动进行。学习是确定合适的参数的过程,而人要做的是思考感知机的构造(模型),并把训练数据交给计算机。

基于感知机模型的一维应力场

现在考虑一个一维位移分布。此处,位移    是通过坐标    的线性变换获得的,即   ,可使用以下代码:

  model = torch.nn.Linear(1, 1)

模型参数可以通过以下方式设置:

  model.weight.data = torch.tensor([[w]])
model.bias.data = torch.tensor([b])

在区间    内采样位移,并使用一维公式计算应变    和应力   

其中   

  
import
 torch
import
 matplotlib.pyplot as plt
from
 torch.autograd import grad

w = 200.0E-6  #权重和偏置
b = 1.0
model = torch.nn.Linear(1, 1)  #定义一个线性模型:输入维度1,输出维度1

#覆盖随机初始化的权重。默认情况下,Linear层的权重和偏置是随机初始化的。这里直接将其设置为预定义的w和b

model.weight.data = torch.tensor([[w]])
model.bias.data = torch.tensor([b])

nx = 5   # 生成5个等间距的点
# 在区间 [−1,1] 上生成 5 个点。requires_grad=True启用自动微分,后续可以计算这些点的导数。

# unsqueeze(1):将形状从 (5,) 转换为 (5, 1),以匹配线性模型的输入维度。

x = torch.linspace(-1, 1, nx, requires_grad=True).unsqueeze(1)


d = model(x)  # d是模型对输入x的输出,即d=wx+b。
dd_dx = grad(d, x, torch.ones_like(x), create_graph=True, retain_graph=True)[0]
# grad(d, x, ...):计算 d 对 x 的梯度(导数)。

# torch.ones_like(x):梯度的初始值(全 1)。

# create_graph=True:保留计算图,允许进一步求导。

# retain_graph=True:防止计算图被释放(通常用于多次求导)。

# dd_dx 是 $ \frac{dd}{dx} = w $(因为 $ d = wx + b $,导数为 w)。

# eps = dd_dx:将导数赋值给 eps(应变)。


eps = dd_dx

E = 210000.0
sig = E * eps  #计算应力


fig, ax = plt.subplots(1, 3, figsize=(15, 5))
ax[0].plot(x.detach(), d.detach(), "k")
ax[0].set_title("$u$")
ax[1].plot(x.detach(), eps.detach(), "k")
ax[1].set_title("$ε$")
ax[2].plot(x.detach(), sig.detach(), "k")
ax[2].set_title("$σ$")
fig.tight_layout()
plt.show()

数值输出验证

变量      
值      
理论值      
     
[-1, -0.5, 0, 0.5, 1]      
5 个等间距点      
     
[0.9998, 0.9999, 1.0, 1.0001, 1.0002]      
斜率为 200e-6 的直线      
     
[0.0002, 0.0002, 0.0002, 0.0002, 0.0002]      
= w = 200×10⁻⁶      
 ✅      
     
[42, 42, 42, 42, 42]      
= 210000 × 200e-6 = 42      
 ✅      

 


来源:数值分析与有限元编程
python理论控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-08-26
最近编辑:57分钟前
太白金星
本科 慢慢来
获赞 14粉丝 32文章 397课程 0
点赞
收藏
作者推荐

用高斯积分法计算结构位移

高斯积分是常见的数值积分方法,是有限元计算中常用的数学工具。对于简化积分运算大有裨益。现在将其推广到结构力学,在计算结构位移时,用高斯积分来替代图乘法,同时用Python的sympy模块编程计算。一、核心思路在结构力学中,计算梁的挠度时,其莫尔积分公式为:其中:• --实际荷载引起的弯矩方程• -- 虚拟状态施加单位力引起的弯矩方程• --截面抗弯刚度• --梁的长度当 和 是复杂函数时,就需要用数值积分,而高斯积分是其中最精确、最高效的方法之一。二、高斯积分法高斯积分的基本思想是:在积分区间内,精心选择一些非等距的积分点(高斯点),用这些点上的函数值乘以相应的权重系数后求和,来近似积分值。对于一个在标准区间 上的积分,其公式为:其中:• --高斯积分点的个数• --第 个高斯点的坐标(在区间 内)• --第 个高斯点对应的权重• --被积函数重要特性:对于 个高斯点,该方法可以精确积分最高 次的多项式。根据被积函数 的多项式次数,选择足够的高斯点数 以保证精度。如果 和 是多项式,其乘积也是多项式,可以选择能精确积分的 值。常用 或 已能满足大部分工程精度。常用高斯点与权重表( 和 ): 高斯点坐标 权重 2 3 用高斯积分法计算位移的步骤:1. 坐标变换将积分区间从物理坐标 映射到自然坐标 。 于是位移积分变为:2. 定义被积函数令: 这里 和 是实际弯矩和单位弯矩方程用自然坐标 表示的函数。3. 计算积分近似值利用公式: 三、实例应用一根简支梁,长 ,全跨受均布荷载 , 。用高斯积分法求跨中C点的竖向位移。1. 建立弯矩方程 (以左端A为原点)• 实际荷载弯矩 : • 虚拟状态的单位荷载弯矩 (在跨中C点加竖直向下的单位力1): 由于对称,我们可积分一半长度(0到2)再乘以2。2. 坐标变换 (对左半段 )• 区间长度 • 变换: , • 在左半段, 3. 定义被积函数 (对左半段) 4. 选择 高斯积分被积函数最高次为3次,故选择2个高斯点。python代码 import sympy as spx, EI, xi, L1, w = sp.symbols(&#39;x EI xi L1 w&#39;)Mx = 20*x - 5*x**2mx = 0.5*xf_x = (L1/(2*EI)) * Mx * mx * w # 被积函数f_xi = f_x.subs( x, L1/2 * (1 + xi) ) # 将 x 用xi替换# Gauss-Legendre 积分点(-0.57735 ≈ -1/√3, 1/0.57735 ≈ 1/√3)points = [-0.57735, 0.57735]weight = [1.0, 1.0]delta = 0for i in range(2): # 同时代入当前积分点的 xi 和权重 w delta += f_xi.subs({ xi: points[i], w: weight[i]} )r = delta.subs({EI: 1.6e4, L1: 2})2*r #对称性,左右半跨结果一样,故乘以2 来源:数值分析与有限元编程

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