颠覆式文本剪辑:Autocut如何实现视频处理效率提升10倍

核心内容摘要

深度解析TiKV架构:Raft共识算法如何构建高可用分布式存储系统
BGE-Large-Zh与ElasticSearch集成:企业搜索方案

League Akari:智能优化英雄联盟竞技体验的全能工具集

2026美赛期间会持续更新相关内容所有内容会发布到专栏内会结合最新的chatgpt发布只需订阅一次赛后两天半价内容达不到所有人预期请勿盲目订阅无论文无论文摘要偏微分方程Partial Differential Equations, PDEs作为描述物理、生物、经济和社会现象中连续变化过程的核心数学工具在数学建模竞赛中具有重要地位。

本文从数学建模竞赛的实用视角系统阐述热传导方程与扩散方程的核心思想、数学模型、适用场景、建模步骤、求解方法及其在美赛中的应用。

文章将结合具体

案例分析该类方法的优缺点并提出改进方向为竞赛参与者提供全面的技术参考和实践指导。

核心思想与数学模型

1 偏微分方程基本概念偏微分方程是包含未知函数及其偏导数的方程用于描述多变量连续系统的变化规律。

与常微分方程描述单变量系统不同PDEs能够刻画时空连续变化的过程。

2 热传导方程傅里叶定律的数学表达物理背景热传导方程源于傅里叶热传导定律描述热量在介质中的传递过程。

其核心物理思想是热流密度与温度梯度成正比方向相反。

数学模型一维热传导方程的标准形式为∂u∂tα∂2u∂x2∂t∂u​α∂x2∂2u​其中$u(x,t)$ 表示位置$x$处时间$t$的温度$\alpha \frac{k}{\rho c}$ 为热扩散系数$k$ 为热传导系数$\rho$ 为密度$c$ 为比热容三维热传导方程推广为∂u∂tα(∂2u∂x2∂2u∂y2∂2u∂z

α∇2u∂t∂u​α(∂x2∂2u​∂y2∂2u​∂z2∂2u​)α∇2u方程类型分析热传导方程属于抛物型偏微分方程具有典型的耗散特性初始扰动随时间扩散并逐渐衰减。

3 扩散方程菲克定律的推广物理背景扩散方程描述物质从高浓度区域向低浓度区域的输运过程基于菲克第一定律扩散通量与浓度梯度成正比。

数学模型一维扩散方程∂C∂tD∂2C∂x2∂t∂C​D∂x2∂2C​其中$C(x,t)$ 表示位置$x$处时间$t$的浓度$D$ 为扩散系数与热传导方程中的$\alpha$物理意义相似扩散方程的推广形式带源项/汇项的扩散方程∂C∂tD∇2Cf(x,t,C)∂t∂C​D∇2Cf(x,t,C)其中$f$表示系统内部的产生或消耗项对流-扩散方程∂C∂tv⋅∇CD∇2CQ∂t∂C​v⋅∇CD∇2CQ其中$\mathbf{v}$为流速场$Q$为源项非线性扩散方程∂C∂t∇⋅(D(C)∇C)∂t∂C​∇⋅(D(C)∇C)扩散系数$D$依赖于浓度$C$本身

4 边界条件与初始条件初始条件u(x,

u0(x),x∈Ωu(x,

u0​(x),x∈Ω边界条件类型狄利克雷边界条件第一类边界条件u(x,t)g(x,t),x∈∂Ωu(x,t)g(x,t),x∈∂Ω描述边界上的函数值诺伊曼边界条件第二类边界条件∂u∂nh(x,t),x∈∂Ω∂n∂u​h(x,t),x∈∂Ω描述边界上的通量罗宾边界条件第三类边界条件aub∂u∂nc(x,t),x∈∂Ωaub∂n∂u​c(x,t),x∈∂Ω混合边界条件

适用场景与典型赛题类型

1 适用场景分析物理领域热传导问题建筑物热工性能分析、电子元件散热设计、地热资源评估扩散问题污染物在水体/大气中扩散、药物在组织中渗透、半导体掺杂过程流体力学作为纳维-斯托克斯方程的简化形式生物领域种群动力学生物种群的空间扩散神经科学神经元电信号传导生态学入侵物种扩散模型社会经济领域信息传播谣言、新技术、文化观念的扩散金融数学布莱克-斯科尔斯方程期权定价城市发展城市扩张、人口迁移

2 数学建模竞赛中的典型赛题类型类型一纯扩散/传导问题特征系统内无明显对流仅考虑扩散机制示例地下水污染扩散、建筑物温度分布、药物缓释类型二对流-扩散问题特征同时存在定向输运和扩散过程示例河流污染物迁移、大气污染物传输、血液中药物输运类型三反应-扩散系统特征包含化学反应或生物相互作用项示例化学振荡BZ反应、动植物种群竞争、流行病传播类型四具有复杂边界/介质的问题特征非规则几何形状、非均匀介质、时变边界示例不规则区域热传导、分层介质中污染物迁移

具体建模步骤与关键技巧

1 数学建模全流程步骤1问题分析与简化识别主导物理过程确定是纯扩散、对流-扩散还是反应-扩散确定时空尺度选择合适的时间和空间尺度简化假设介质是否均匀各向同性边界条件是否可以简化是否可降维处理步骤2建立控制方程基于守恒定律质量守恒、能量守恒、动量守恒本构关系傅里叶定律、菲克定律等源汇项建模化学反应速率、生物生长率等步骤3确定定解条件初始条件系统初始状态边界条件根据实际问题选择合适类型步骤4无量纲化关键技巧无量纲化能减少参数数量揭示系统本质特征示例一维扩散方程无量纲化原始方程$\frac{\partial C}{\partial t} D \frac{\partial^2 C}{\partial x^2}$令XxL,Ttτ,UCC0XLx​,Tτt​,UC0​C​其中$L$为特征长度$\tau$为特征时间$C_0$为特征浓度无量纲方程$\frac{\partial U}{\partial T} \frac{D\tau}{L^2} \frac{\partial^2 U}{\partial X^2}$定义傅里叶数$Fo \frac{D\tau}{L^2}$步骤5选择求解方法方法类型适用场景优点缺点解析解规则几何、线性问题精确、物理意义清晰适用范围有限有限差分法规则网格简单、直观复杂边界处理困难有限元法复杂几何边界适应性强计算复杂谱方法光滑解高精度复杂边界困难有限体积法守恒问题保证守恒性精度较低步骤6数值求解与验证网格收敛性分析时间步长稳定性分析与解析解/实验数据对比

2 关键建模技巧技巧1对称性利用轴对称问题可简化为二维球对称问题可简化为径向一维问题技巧2源项线性化处理对于非线性源项$f(u)$可采用显式处理$f(u^n)$隐式处理$f(u^{n1})$半隐式处理线性化$f(u^{n1}) \approx f(u^n) f(u^n)(u^{n1}-u^n)$技巧3自适应网格与时间步长python# 自适应时间步长伪代码 while t t_final: dt_estimate estimate_optimal_dt(u, dx, D, methodCFL) dt min(dt_estimate, dt_max) u_new solve_step(u, dt, dx) error estimate_error(u, u_new) if error tol: t dt u u_new else: dt dt *

5 # 减小时间步长重试技巧4边界条件处理技巧虚拟网格法在边界外设置虚拟网格点镜像法利用对称性构造虚拟点插值法高阶边界条件处理

常用求解工具/代码示例

1 MATLAB求解示例一维热传导方程有限差分求解matlab%% 参数设置 L 1; % 杆长度 T

5; % 总时间 D

01; % 热扩散系数 Nx 100; % 空间网格数 Nt 1000; % 时间步数 dx L/Nx; % 空间步长 dt T/Nt; % 时间步长 r D*dt/dx^2; % 稳定性参数 %% 稳定性检查 if r

5 error(稳定性条件不满足请减小时间步长); end %% 初始化 x linspace(0, L, Nx

; u zeros(Nx1, Nt

; %% 初始条件中心热源 u(:,

exp(-100*(x-

0.

.^

; %% 边界条件两端绝热 left_boundary 0; % 诺伊曼边界du/dx0 right_boundary 0; % 诺伊曼边界du/dx0 %% 有限差分求解Crank-Nicolson方法 A diag(2*(1r)*ones(Nx-1,

) diag(-r*ones(Nx-2,

,

diag(-r*ones(Nx-2,

,-

; B diag(2*(1-r)*ones(Nx-1,

) diag(r*ones(Nx-2,

,

diag(r*ones(Nx-2,

,-

; for n 1:Nt b B * u(2:end-1, n); u(2:end-1, n

A \ b; end %% 可视化 [X, T_mesh] meshgrid(linspace(0,T,Nt

, x); figure; surf(T_mesh, X, u, EdgeColor, none); xlabel(时间); ylabel(位置); zlabel(温度); title(一维热传导方程数值解); colormap(jet); colorbar;

2 Python求解示例二维扩散方程有限体积法求解pythonimport numpy as np import matplotlib.pyplot as plt from scipy.sparse import diags, csr_matrix from scipy.sparse.linalg import spsolve import matplotlib.animation as animation def solve_diffusion_2d(Nx50, Ny50, D

1, T

0, dt

0.

: 求解二维扩散方程 # 网格参数 Lx, Ly

0,

0 dx, dy Lx/Nx, Ly/Ny # 稳定性检查 rx D*dt/dx**2 ry D*dt/dy**2 if rx ry

5: raise ValueError(f稳定性条件不满足: rxry{rxry:.3f}

0.

# 网格 x np.linspace(0, Lx, Nx

y np.linspace(0, Ly, Ny

X, Y np.meshgrid(x, y) # 初始条件中心高斯分布 u0 np.exp(-50*((X-

0.

**2 (Y-

0.

**

) u u

copy() # 构造系数矩阵隐式格式 N (Nx

*(Ny

main_diag np.ones(N) * (1 2*D*dt/dx**2 2*D*dt/dy**

x_diag np.ones(N-

* (-D*dt/dx**

y_diag np.ones(N-(Nx

) * (-D*dt/dy**

# 设置边界条件狄利克雷边界u0 for i in range(Nx

: main_diag[i]

0 # 下边界 main_diag[-(i

]

0 # 上边界 for j in range(Ny

: idx j*(Nx

main_diag[idx]

0 # 左边界 main_diag[idxNx]

0 # 右边界 A diags([main_diag, x_diag, x_diag, y_diag, y_diag], [0, 1, -1, Nx1, -(Nx

], formatcsr) # 时间迭代 u_flat u.flatten() steps int(T/dt) solution [u

copy()] for step in range(steps): b u_flat.copy() # 边界条件修正 for i in range(Nx

: b[i]

0 # 下边界 b[-(i

]

0 # 上边界 for j in range(Ny

: idx j*(Nx

b[idx]

0 # 左边界 b[idxNx]

0 # 右边界 u_flat spsolve(A, b) u u_flat.reshape((Ny1, Nx

) if step % 100 0: solution.append(u.copy()) return X, Y, solution def animate_solution(X, Y, solution): 动画显示扩散过程 fig plt.figure(figsize(10,

) ax fig.add_subplot(111, projection3d) def update(frame): ax.clear() surf ax.plot_surface(X, Y, solution[frame], cmapviridis, edgecolornone, alpha

0.

ax.set_zlim(0,

ax.set_title(f二维扩散过程 (时间步: {frame})) ax.set_xlabel(X) ax.set_ylabel(Y) ax.set_zlabel(浓度) return surf, ani animation.FuncAnimation(fig, update, frameslen(solution), interval100, blitFalse) plt.tight_layout() plt.show() return ani # 运行求解 X, Y, solution solve_diffusion_2d(Nx30, Ny30, D

05, T

0, dt

0.

ani animate_solution(X, Y, solution)

3 商业软件与开源工具COMSOL Multiphysics特点多物理场耦合GUI操作友好适用复杂几何、多物理场问题FEniCS开源有限元库pythonfrom fenics import * # 定义网格和函数空间 mesh UnitSquareMesh(32,

V FunctionSpace(mesh, P,

# 定义边界条件 def boundary(x, on_boundary): return on_boundary bc DirichletBC(V, Constant(

, boundary) # 定义变分问题 u TrialFunction(V) v TestFunction(V) f Constant(

D Constant(

0.

F u*v*dx D*dt*dot(grad(u), grad(v))*dx - (u_n dt*f)*v*dx a, L lhs(F), rhs(F) # 求解 u Function(V) solve(a L, u, bc)

一个完整的美赛简化案例2021年ICM Problem D: 音乐的影响

1 问题重述与建模思路问题背景研究音乐流派在时间与空间上的传播规律。

假设音乐流派的流行度可用浓度表示其传播过程类似于文化扩散。

核心问题如何定量描述音乐流派在空间上的扩散音乐流派如何随时间演化不同流派间存在何种相互作用

2 数学模型建立步骤1建立基本扩散方程假设音乐流派$i$在位置$\mathbf{x}$、时间$t$的流行度为$u_i(\mathbf{x}, t)$其扩散满足∂ui∂tDi∇2uifi(u1,u2,...,un)∂t∂ui​​Di​∇2ui​fi​(u1​,u2​,...,un​)其中$D_i$为扩散系数反映传播速度$f_i$为反应项表示流派间的竞争/合作步骤2反应项建模Lotka-Volterra竞争模型fi(u1,...,un)riui(1−uiKi−∑j≠iαijujKj)fi​(u1​,...,un​)ri​ui​(1−Ki​ui​​−∑ji​αij​Kj​uj​​)其中$r_i$自然增长率$K_i$环境容量$\alpha_{ij}$竞争系数$\alpha_{ij}0$表示竞争$\alpha_{ij}0$表示共生步骤3空间异质性考虑扩散系数和增长率可能与空间位置相关DiDi(x),riri(x)Di​Di​(x),ri​ri​(x)例如城市区域$D_i$较大农村区域$D_i$较小步骤4完整模型∂ui∂t∇⋅(Di(x)∇ui)ri(x)ui(1−uiKi−∑j≠iαijujKj)∂t∂ui​​∇⋅(Di​(x)∇ui​)ri​(x)ui​(1−Ki​ui​​−∑ji​αij​Kj​uj​​)

3 数值求解与参数估计参数估计方法扩散系数$D_i$基于社交媒体数据分析信息传播速度竞争系数$\alpha_{ij}$基于音乐流派的相似性使用音频特征或歌词主题环境容量$K_i$基于人口密度和年龄分布数值求解代码框架pythonimport numpy as np from scipy.integrate import solve_ivp from scipy.sparse import diags import matplotlib.pyplot as plt class MusicDiffusionModel: def __init__(self, n_genres3, Nx

: self.n_genres n_genres self.Nx Nx self.L

0 # 空间尺度 self.dx self.L / (Nx-

# 初始化参数示例值 self.D np.array([

01,

005,

002]) # 扩散系数 self.r np.array([

1,

08,

05]) # 增长率 self.K np.array([

0,

8,

6]) # 环境容量 self.alpha np.array([[0,

2,

1], # 竞争矩阵 [

2, 0,

3], [

1,

3, 0]]) def laplacian_1d(self, u): 一维离散拉普拉斯算子 L np.zeros_like(u) L[1:-1] (u[2:] - 2*u[1:-1] u[:-2]) / self.dx**2 return L def reaction_term(self, u_vec): 反应项Lotka-Volterra竞争模型 n self.n_genres Nx self.Nx f np.zeros_like(u_vec) for i in range(n): u_i u_vec[i*Nx:(i

*Nx] competition np.zeros(Nx) for j in range(n): if i ! j: u_j u_vec[j*Nx:(j

*Nx] competition self.alpha[i,j] * u_j / self.K[j] f[i*Nx:(i

*Nx] self.r[i] * u_i * (1 - u_i/self.K[i] - competition) return f def pde_system(self, t, u_vec): 完整的PDE系统 n self.n_genres Nx self.Nx du np.zeros_like(u_vec) # 扩散项 for i in range(n): u_i u_vec[i*Nx:(i

*Nx] diffusion self.D[i] * self.laplacian_1d(u_i) du[i*Nx:(i

*Nx] diffusion # 反应项 du self.reaction_term(u_vec) # 边界条件诺伊曼边界无通量 for i in range(n): du[i*Nx] 0 du[(i

*Nx-1] 0 return du def solve(self, t_span(0,

, u0None): 求解PDE系统 if u0 is None: # 初始条件每个流派在不同位置有不同初始流行度 u0 np.zeros(self.n_genres * self.Nx) for i in range(self.n_genres): center self.L/2

1*(i-

x np.linspace(0, self.L, self.Nx) u0[i*self.Nx:(i

*self.Nx]

5*np.exp(-50*(x-center)**

# 使用BDF方法求解刚性系统 sol solve_ivp(self.pde_system, t_span, u0, methodBDF, max_step

1, rtol1e-6, atol1e-

return sol def visualize(self, sol): 可视化结果 x np.linspace(0, self.L, self.Nx) t sol.t U sol.y fig, axes plt.subplots(2, 2, figsize(12,

) # 各流派最终空间分布 for i in range(self.n_genres): u_final U[i*self.Nx:(i

*self.Nx, -1] axes[0,0].plot(x, u_final, labelf流派 {i1}) axes[0,0].set_xlabel(位置) axes[0,0].set_ylabel(流行度) axes[0,0].set_title(最终空间分布) axes[0,0].legend() axes[0,0].grid(True) # 中心点的时间演化 center_idx self.Nx // 2 for i in range(self.n_genres): u_center U[i*self.Nxcenter_idx, :] axes[0,1].plot(t, u_center, labelf流派 {i1}) axes[0,1].set_xlabel(时间) axes[0,1].set_ylabel(流行度) axes[0,1].set_title(中心点时间演化) axes[0,1].legend() axes[0,1].grid(True) # 流派1的空间-时间演化 u1 U[0:self.Nx, :] im1 axes[1,0].imshow(u1, aspectauto, extent[t[0], t[-1], x[-1], x[0]], cmaphot) axes[1,0].set_xlabel(时间) axes[1,0].set_ylabel(位置) axes[1,0].set_title(流派1的空间-时间演化) plt.colorbar(im1, axaxes[1,0]) # 总流行度的时间演化 total_popularity np.sum(U.reshape(self.n_genres, self.Nx, -

, axis

for i in range(self.n_genres): axes[1,1].plot(t, total_popularity[i], labelf流派 {i1}) axes[1,1].set_xlabel(时间) axes[1,1].set_ylabel(总流行度) axes[1,1].set_title(总流行度时间演化) axes[1,1].legend() axes[1,1].grid(True) plt.tight_layout() plt.show() # 运行模型 model MusicDiffusionModel(n_genres3, Nx

sol model.solve(t_span(0,

) model.visualize(sol)

4 结果分析与模型验证敏感性分析pythondef sensitivity_analysis(): 关键参数敏感性分析 base_params {D: [

01,

005,

002], r: [

1,

08,

05], alpha: [[0,

2,

1], [

2, 0,

3], [

1,

3, 0]]} variations [] # 分析扩散系数的影响 for D_factor in [

5,

0,

0]: model MusicDiffusionModel(n_genres3, Nx

model.D np.array(base_params[D]) * D_factor sol model.solve(t_span(0,

) final_popularity np.sum(sol.y[:,-1]) variations.append((D, D_factor, final_popularity)) # 分析竞争系数的影响 for alpha_factor in [

5,

0,

5]: model MusicDiffusionModel(n_genres3, Nx

model.alpha np.array(base_params[alpha]) * alpha_factor sol model.solve(t_span(0,

) final_popularity np.sum(sol.y[:,-1]) variations.append((alpha, alpha_factor, final_popularity)) return variations模型验证策略历史数据拟合使用实际音乐流行度数据校准模型参数预测能力测试用部分数据训练剩余数据验证稳态分析理论稳态解与数值解对比

5 模型应用与政策建议基于模型结果可提出音乐推广策略针对不同扩散特性的区域采取不同推广方式文化多样性保护通过调整竞争系数模拟政策干预效果新流派引入时机计算最优引入时机以最大化接受度

该方法的优缺点及改进方向

1 优点分析理论优势物理基础坚实基于守恒定律具有明确的物理意义连续描述能力适合描述时空连续变化过程可解释性强参数具有明确物理/生物/社会意义计算优势数值方法成熟有限差分、有限元等方法发展完善计算效率可控可通过网格粗细平衡精度与效率并行化潜力大适合高性能计算应用优势多尺度适应性可通过参数调整适应不同时空尺度多场耦合能力易于与其他物理过程耦合预测外推能力基于物理机制具有一定外推能力

2 缺点与局限性理论局限性连续性假设要求系统连续不适用于离散系统线性假设限制许多实际过程本质非线性参数不确定性实际系统参数难精确获取计算挑战高维问题计算量大维度灾难Curse of Dimensionality复杂边界处理困难不规则几何需要特殊技术长时间积分稳定性数值耗散、色散问题应用限制数据需求量大需要充分数据确定参数和验证特定领域知识要求需要深入了解所研究领域简化假设可能失真过度简化可能丢失关键机制

3 改进方向与前沿发展理论方法改进多尺度建模∂u∂tLmicro(u)Lmacro(u)∂t∂u​Lmicro​(u)Lmacro​(u)结合微观机制与宏观现象随机偏微分方程du[D∇2uf(u)]dtσ(u)dWtdu[D∇2uf(u)]dtσ(u)dWt​考虑随机涨落影响分数阶扩散方程∂αu∂tαD∂βu∂xβ∂tα∂αu​D∂xβ∂βu​描述反常扩散现象数值方法创新深度学习增强求解python# PINNsPhysics-Informed Neural Networks框架 class PINN(nn.Module): def __init__(self): super().__init__() self.net nn.Sequential( nn.Linear(3,

, nn.Tanh(), # 输入: (x, y, t) nn.Linear(50,

, nn.Tanh(), nn.Linear(50,

# 输出: u(x,y,t) ) def pde_loss(self, x, y, t): u self.net(torch.cat([x, y, t], dim

) # 自动微分计算偏导数 u_t torch.autograd.grad(u, t, grad_outputstorch.ones_like(u), create_graphTrue)[0] u_xx torch.autograd.grad( torch.autograd.grad(u, x, grad_outputstorch.ones_like(u), create_graphTrue)[0], x, grad_outputstorch.ones_like(u), create_graphTrue)[0] # PDE残差 residual u_t - D*u_xx return torch.mean(residual**

自适应网格细化AMRpythondef adaptive_mesh_refinement(u, threshold

0.

: 基于解的梯度自适应加密网格 grad np.abs(np.gradient(u)) refine_mask grad threshold * np.max(grad) # 在refine_mask为True的区域细分网格 return refined_mesh高性能计算技术GPU加速CUDA分布式并行计算混合精度计算应用领域拓展机器学习结合使用神经网络学习源项$f(u)$数据同化技术结合观测数据不确定性量化UQ多物理场耦合热-流-固耦合生物-化学-物理过程耦合社会-经济-环境系统耦合实时仿真与优化数字孪生技术实时参数反演最优控制应用

4 数学建模竞赛中的实用建议队伍组建建议理论成员负责方程建立、稳定性分析、解析解推导编程成员负责数值实现、可视化、参数敏感性分析写作成员负责模型解释、结果分析、论文撰写时间管理策略阶段时间占比关键任务问题分析20%理解问题、简化假设、确定模型类型模型建立25%方程推导、参数确定、无量纲化数值求解25%算法选择、代码实现、验证测试结果分析20%敏感性分析、模型检验、政策建议论文撰写10%结果可视化、结论提炼、摘要撰写常见陷阱规避避免过度复杂化从简单模型开始逐步增加复杂性重视无量纲化减少参数数量揭示系统本质保证数值稳定性严格检查CFL条件、收敛性进行敏感性分析识别关键参数评估模型鲁棒性与实际数据对比避免纸上谈兵增强模型可信度创新点挖掘方向结合新数据源社交媒体数据、卫星遥感数据等引入新机制考虑时滞效应、记忆效应、网络结构开发新求解器针对特定问题设计高效专用算法跨学科应用将物理模型应用于社会经济问题结语偏微分方程作为描述连续系统时空演化的核心数学工具在数学建模竞赛中具有广泛应用价值。

热传导方程与扩散方程虽然起源于物理领域但其数学框架可扩展至生物、社会、经济等多个领域。

成功的PDE建模不仅需要坚实的数学基础还需要对实际问题的深刻理解、合理的简化假设、稳健的数值实现以及全面的结果分析。

在数学建模竞赛中PDE方法特别适合那些涉及时空连续变化、具有明确物理机制或可类比物理过程的问题。

参赛者应掌握从问题分析到模型建立、从数值求解到结果验证的全流程技能同时注意平衡模型复杂性与可解性确保在有限时间内获得有意义的成果。

9.1.gbd之交-9.1.gbd之交应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123