当前位置: 首页 > news >正文

MATLAB - 仿真单摆的周期性摆动

系列文章目录

 


前言

本例演示如何使用 Symbolic Math Toolbox™ 模拟单摆的运动。推导摆的运动方程,然后对小角度进行分析求解,对任意角度进行数值求解。

a63818f5d19e454581544d5694154996.png


 

一、步骤 1:推导运动方程

摆是一个遵循微分方程的简单机械系统。摆最初静止在垂直位置。当摆移动一个角度 θ 并释放时,重力将其拉回静止位置。它的动量会使它过冲并到达 -θ 角(如果没有摩擦力),以此类推。由于重力的作用,钟摆运动的恢复力为 -mgsinθ。因此,根据牛顿第二定律,质量乘以加速度必须等于 -mgsinθ。

syms m a g theta(t)
eqn = m*a == -m*g*sin(theta)
eqn(t) = a m=−g m sin(θ(t))

对于长度为 r 的摆锤,摆锤的加速度等于角加速度乘以 r。

eq?a%3Dr%5Cfrac%7Bd%5E2%5Ctheta%7D%7Bdt%5E2%7D.

用子项代替 a。 

syms r
eqn = subs(eqn,a,r*diff(theta,2))

 eq?%5Cbegin%7Baligned%7Deqn%28t%29%26%3D%5C%5Cmr%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%26%5Ctheta%28t%29%3D-gm%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D

使用 isolate 隔离公式中的角加速度。

eqn = isolate(eqn,diff(theta,2))

eq?%5Cbegin%7Baligned%7D%5Ctext%7Beqn%20%3D%7D%20%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Cleft.%5Ctheta%28t%29%3D-%5Cfrac%7Bg%5Csin%28%5Ctheta%28t%29%29%7Dr%5Cright.%5Cend%7Baligned%7D

将常数 g 和 r 合并为一个参数,也称为固有频率。

eq?%5Comega_0%3D%5Csqrt%7B%5Cdfrac%7Bg%7D%7Br%7D%7D.

syms omega_0
eqn = subs(eqn,g/r,omega_0^2)

eq?%5Cbegin%7Baligned%7D%5Ctext%7Beqn%20%3D%7D%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Ctheta%28t%29%3D-%5Comega_0%5E2%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D

二、步骤 2:运动方程线性化

运动方程是非线性的,因此难以用解析法求解。假设角度很小,利用 sinθ 的泰勒展开式将方程线性化。 

syms x
approx = taylor(sin(x),x,'Order',2);
approx = subs(approx,x,theta(t))

eq?approx%20%3D%20%5Ctheta%28t%29

运动方程变成了线性方程。

eqnLinear = subs(eqn,sin(theta(t)),approx)

eq?%5Cbegin%7Baligned%7D%5Ctext%7BeqnLinear%7D%26%3D%5C%5C%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Ctheta%28t%29%26%3D-%5Comega_0%5E2%5Ctheta%28t%29%5Cend%7Baligned%7D

三、步骤 3:分析求解运动方程

使用 dsolve 求解方程 eqnLinear。将初始条件指定为第二个参数。使用 assume 假设 ω0 为实数,简化解法。

syms theta_0 theta_t0
theta_t = diff(theta);
cond = [theta(0) == theta_0, theta_t(0) == theta_t0];
assume(omega_0,'real')
thetaSol(t) = dsolve(eqnLinear,cond)

eq?%5Cbegin%7Baligned%7D%5Ctext%7Bthetasol%28t%29%7D%26%3D%5Ctheta_0%5Ccos%28%5Comega_0t%29+%5Cfrac%7B%5Ctheta_%7Bt0%7D%5Csin%28%5Comega_0t%29%7D%7B%5Comega_0%7D%5Cend%7Baligned%7D

四、步骤 4:ω0 的物理意义

项 ω 0 t 称为相位。余弦函数和正弦函数每 2π 重复一次。改变 ω 0 t 变化 2π 所需的时间称为时间周期。

eq?T%3D%5Cdfrac%7B2%5Cpi%7D%7B%5Comega0%7D%3D2%5Cpi%5Csqrt%7B%5Cdfrac%7Br%7D%7Bg%7D%7D.

时间周期 T 与摆长的平方根成正比,与质量无关。对于线性运动方程,时间周期与初始条件无关。

五、步骤 5:绘制摆的运动图

绘制小角度近似的摆运动图。

定义物理参数:

  • 重力加速度 s%7D%5E%7B2%7D
  • 摆长 eq?%5Ctext%7Br%3D1%20m%7D

 

gValue = 9.81;
rValue = 1;
omega_0Value = sqrt(gValue/rValue);
T = 2*pi/omega_0Value;

设置初始条件。

theta_0Value  = 0.1*pi; % Solution only valid for small angles.
theta_t0Value = 0;      % Initially at rest.

 将物理参数和初始条件代入一般解法。

vars   = [omega_0      theta_0      theta_t0];
values = [omega_0Value theta_0Value theta_t0Value];
thetaSolPlot = subs(thetaSol,vars,values);

 绘制谐摆运动图。

fplot(thetaSolPlot(t*T)/pi, [0 5]);
grid on;
title('Harmonic Pendulum Motion');
xlabel('t/T');
ylabel('\theta/\pi');

8eb90a748ded400aa701f5e81c3b2531.png

求出 θ(t) 的解后,想象一下摆的运动。 

x_pos = sin(thetaSolPlot);
y_pos = -cos(thetaSolPlot);
fanimator(@fplot,x_pos,y_pos,'ko','MarkerFaceColor','k','AnimationRange',[0 5*T]);
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'),'AnimationRange',[0 5*T]);
fanimator(@(t) text(-0.3,0.3,"Timer: "+num2str(t,2)+" s"),'AnimationRange',[0 5*T]);

f7032f03593c4a37b21f75d0d7abdedd.png

输入 playAnimation 命令播放钟摆运动的动画。 

6c850fe8dde34909aa426df85a494e71.gif

六、步骤 6:使用恒定能量路径确定非线性摆运动

为了理解摆的非线性运动,请使用总能量方程来直观显示摆的运动轨迹。总能量是守恒的。

eq?E%3D%5Cdfrac12mr%5E2%7B%5Cleft%28%5Cdfrac%7Bd%5Ctheta%7D%7Bdt%7D%5Cright%29%7D%5E2+mgr%281-%5Ccos%5Ctheta%29 

使用三角函数特性 2%29 和关系式 r%7D 重写比例能量。

eq?%5Cdfrac%20E%7Bmr%5E2%7D%3D%5Cdfrac12%5Cleft%5B%5Cleft%28%5Cdfrac%7Bd%5Ctheta%7D%7Bdt%7D%5Cright%29%5E2+%5Cleft%282%5Comega_0%5Csin%5Cdfrac%5Ctheta2%5Cright%29%5E2%5Cright%5D 

由于能量守恒,摆的运动可以用相空间中的恒定能量路径来描述。相空间是一个抽象空间,坐标为 θ 和 dθ/dt。使用 fcontour 将这些路径可视化。

syms theta theta_t omega_0
E(theta, theta_t, omega_0) = (1/2)*(theta_t^2+(2*omega_0*sin(theta/2))^2);
Eplot(theta, theta_t) = subs(E,omega_0,omega_0Value);figure;
fc = fcontour(Eplot(pi*theta, 2*omega_0Value*theta_t), 2*[-1 1 -1 1], ...'LineWidth', 2, 'LevelList', 0:5:50, 'MeshDensity', 1+2^8);
grid on;
title('Constant Energy Contours in Phase Space ( \theta vs. \theta_t )');
xlabel('\theta/\pi');
ylabel('\theta_t/2\omega_0');

1ca04c2158374f96a101b5ad1e0aed66.png

恒定能量等值线围绕 θ 轴和 dθ/dt 轴对称,沿 θ 轴呈周期性分布。图中显示了两个行为截然不同的区域。

等值线图的较低能量相互靠近。摆锤在两个最大角度和速度之间来回摆动。摆锤的动能不足以克服重力能,使摆锤绕一圈。

afd1ca0e5c744a12bc95dbc61e07a2fe.gif

等值线图中的高能量不会自行闭合。摆锤始终沿着一个角度方向运动。钟摆的动能足以克服重力能,使钟摆能够绕一圈。 

78b67ff177b24fb4a1a4ecf0e2c34c86.gif

七、步骤 7:求解非线性运动方程

非线性运动方程是二阶微分方程。使用 ode45 求解器对这些方程进行数值求解。由于 ode45 只接受一阶系统,因此请将系统简化为一阶系统。然后生成函数句柄,作为 ode45 的输入。

将二阶 ODE 重写为一阶 ODE 系统。

syms theta(t) theta_t(t) omega_0
eqs = [diff(theta)   == theta_t;diff(theta_t) == -omega_0^2*sin(theta)]

 eq?%5Cleft.%5Ctext%7Beqs%7D%28t%29%3D%5C%5C%5Cleft%28%5Cbegin%7Baligned%7D%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20t%7D%26%5Ctheta%28t%29%3D%5Ctheta_t%28t%29%5C%5C%5C%5C%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20t%7D%26%5Ctheta_t%28t%29%3D-%5Comega_0%5E2%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D%5Cright.%5Cright%29

eqs  = subs(eqs,omega_0,omega_0Value);
vars = [theta, theta_t];

 求出系统的质量矩阵 M 和方程 F 的右边。

[M,F] = massMatrixForm(eqs,vars)

 eq?%5Cbegin%7Barray%7D%7Brcl%7D%5Ctext%7BM%7D%26%3D%26%5C%5C%26%26%5Cbegin%7Bbmatrix%7D1%260%5C%5C0%261%5Cend%7Bbmatrix%7D%5Cend%7Barray%7D

eq?%5Cbegin%7Baligned%7D%7BF%7D%26%3D%5C%5C%26%5Cbegin%7Bbmatrix%7D%5Ctheta_t%28t%29%5C%5C-%5Cdfrac%7B981%5Csin%28%5Ctheta%28t%29%29%7D%7B100%7D%5Cend%7Bbmatrix%7D%5Cend%7Baligned%7D

M 和 F 指的就是这种形式。

eq?M%28t%2Cx%28t%29%29%5Cdfrac%7Bdx%7D%7Bdt%7D%3DF%28t%2Cx%28t%29%29. 

为简化进一步计算,可将系统改写为 dt%3Df%28t%2Cx%28t%29%29. 的形式。

f = M\F

 eq?%5Cbegin%7Baligned%7D%5Ctext%7Bf%7D%26%3D%5C%5C%26%5Cbegin%7Bbmatrix%7D%5Ctheta_t%28t%29%5C%5C-%5Cdfrac%7B981%5Csin%28%5Ctheta%28t%29%29%7D%7B100%7D%5Cend%7Bbmatrix%7D%5Cend%7Baligned%7D

使用 odeFunction 将 f 转换为 MATLAB 函数句柄。生成的函数句柄是 MATLAB ODE 求解器 ode45 的输入。 

f = odeFunction(f, vars)
f = function_handle with value:@(t,in2)[in2(2,:);sin(in2(1,:)).*(-9.81e+2./1.0e+2)]

八、步骤 8:求解封闭能量等值线的运动方程

使用 ode45 求解封闭能量等值线的 ODE。

从能量等值线图来看,封闭等值线满足条件 2%5Comega_0%5Cleq1. 将 θ 和 dθ/dt 的初始条件存储在变量 x0 中。

x0 = [0; 1.99*omega_0Value];

指定一个从 0 秒到 10 秒的时间间隔,用于求解。这个时间间隔允许摆锤经历两个完整的周期。

tInit  = 0;
tFinal = 10;

求解 ODE。

sols = ode45(f,[tInit tFinal],x0)
sols = struct with fields:solver: 'ode45'extdata: [1x1 struct]x: [0 3.2241e-05 1.9344e-04 9.9946e-04 0.0050 0.0252 0.1259 0.3449 0.6020 0.8591 1.1161 1.3597 1.5996 1.8995 2.2274 2.4651 2.7028 2.9567 3.2138 3.4709 3.7150 3.9511 4.2483 4.5759 4.8239 5.0719 5.3182 5.5764 5.8346 6.0803 ... ] (1x45 double)y: [2x45 double]stats: [1x1 struct]idata: [1x1 struct]

sols.y(1,:) 表示角位移 θ,sols.y(2,:) 表示角速度 dθ/dt。

绘制闭合路径解。

figure;yyaxis left;
plot(sols.x, sols.y(1,:), '-o');
ylabel('\theta (rad)');yyaxis right;
plot(sols.x, sols.y(2,:), '-o');
ylabel('\theta_t (rad/s)');grid on;
title('Closed Path in Phase Space');
xlabel('t (s)');

80eb2447004a483aa049ee40b70c5470.png

可视化钟摆的运动。 

x_pos = @(t) sin(deval(sols,t,1));
y_pos = @(t) -cos(deval(sols,t,1));
figure;
fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k'));
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'));
fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

8a541ad36396414ea0d689cffcdbaaf0.png

输入 playAnimation 命令播放钟摆运动的动画。 

e77f57e87f15422cba0dc4c074f3bf33.gif

九、步骤 9:开放式能量等值线的求解

使用 ode45 求解开放式能量等值线的 ODE。从能量等值线图来看,开放式等值线满足条件 2%5Comega_0%3E1.

x0 = [0; 2.01*omega_0Value];
sols = ode45(f, [tInit, tFinal], x0);

绘制开放式能量等值线的解。

figure;yyaxis left;
plot(sols.x, sols.y(1,:), '-o');
ylabel('\theta (rad)');yyaxis right;
plot(sols.x, sols.y(2,:), '-o');
ylabel('\theta_t (rad/s)');grid on;
title('Open Path in Phase Space');
xlabel('t (s)');

a44827106aa74d0895ff9f7a600515cf.png

可视化钟摆的运动。 

x_pos = @(t) sin(deval(sols,t,1));
y_pos = @(t) -cos(deval(sols,t,1));
figure;
fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k'));
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'));
fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

371c99980bdb4063b3a0eb97ed8bdcc6.png

输入 playAnimation 命令播放钟摆运动的动画。 

1802195a04a1460c9f83e9708914ec06.gif

 

相关文章:

MATLAB - 仿真单摆的周期性摆动

系列文章目录 前言 本例演示如何使用 Symbolic Math Toolbox™ 模拟单摆的运动。推导摆的运动方程,然后对小角度进行分析求解,对任意角度进行数值求解。 一、步骤 1:推导运动方程 摆是一个遵循微分方程的简单机械系统。摆最初静止在垂直位置…...

Pandas进阶--map映射,分组聚合和透视pivot_table详解

文章目录 1.Pandas的map映射(1)映射(2)map充当运算工具 2.数据分组和透视(1)分组统计 - groupby功能 是pandas最重要的功能(2)聚合agg 3.透视表pivot_table(1&#xff09…...

Visual Studio 和Clion配置Cocos2d-x环境

Visual Studio 和Clion配置Cocos2d-x环境 我就不贴图片的,懒得上传图床。懒。开发环境: ​ 系统: Window11 ​ 编译器: CMake MSVC ​ 开发工具:Clion or Visual Studio ​ 请自行配置好,Python2.7,和Cmake ​ Cocos2d-x下载…...

【百度Apollo】本地调试仿真:加速自动驾驶系统开发的利器

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...

ztest中ddof起什么作用

⭐️ statsmodels 中 ztest 基本使用 statsmodels 也是一个强大的统计分析库,提供了丰富的统计模型和检验功能。对于 Z 检验,statsmodels 提供了 ztest 函数。 以下是使用 statsmodels 进行 Z 检验的示例: from statsmodels.stats.weights…...

linux 主机无法联网问题

主机不能联网 一 查看当前ip ping路由 ifconfig wlan0 wlan0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.2.78 netmask 255.255.255.0 broadcast 192.168.2.255ping 192.168.2.1查看是否能ping通 二 查看路由表 route -n Destination G…...

2024/1/27 备战蓝桥杯 1-1

目录 求和 0求和 - 蓝桥云课 (lanqiao.cn) 成绩分析 0成绩分析 - 蓝桥云课 (lanqiao.cn) 合法日期 0合法日期 - 蓝桥云课 (lanqiao.cn) 时间加法 0时间加法 - 蓝桥云课 (lanqiao.cn) 扫雷 0扫雷 - 蓝桥云课 (lanqiao.cn) 大写 0大写 - 蓝桥云课 (lanqiao.cn) 标题…...

支持下一代网络IpV6的串口服务器,IpV6串口485接口转网口

和IPv4比较&#xff0c;IPv6有两个极具吸引力的特点&#xff1a;一个是IPv6采用的128位地址格式&#xff0c;而IPv4采用32位的地址格式&#xff0c;因此IPv6使地址空间增大了296&#xff1b;另一个是IPv6物联网数据业务具有更强的支持能力&#xff0c;成为未来物联网的重要协议…...

uniapp H5 实现上拉刷新 以及 下拉加载

uniapp H5 实现上拉刷新 以及 下拉加载 1. 先上图 下拉加载 2. 上代码 <script>import DragableList from "/components/dragable-list/dragable-list.vue";import {FridApi} from /api/warn.jsexport default {data() {return {tableList: [],loadingHi…...

网络工程师必学知识:2、IPv4和IPv6地址划分

网络工程师必学知识&#xff1a;2、IPv4和IPv6地址划分 1.概述&#xff1a;2.IPv4&#xff1a;地址划分&#xff1a;有类划分&#xff0c;无类划分。一、有类划分&#xff1a;分为5类。ABCDE&#xff0c;掩码分别位8、16、24、28、27取值范围&#xff1a;出类别bit不变&#xf…...

Rust - 变量

不管学什么语言好像都得从变量开始&#xff0c;不过只需要懂得大概就可以了。 但在Rust里不先把变量研究明白后面根本无法进行… 变量绑定 变量赋值❌ 变量绑定✔️ Rust中没有“赋值”一说&#xff0c;而是称为绑定。 int a 3; //C中的变量赋值 a 3; //python中的…...

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求&#xff1a; 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc…...

用Flask打造一个大模型智能问答WEB网站

目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。 这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演…...

学习python第三天

一.数据类型 1.获取数据类型 x 10 print(type(x))""" 输出 <class int> """2.复数类型&#xff08;complex&#xff09;详解 复数&#xff08;Complex&#xff09;是 Python 的内置类型&#xff0c;直接书写即可。换句话说&#xff0c…...

(M)UNITY三段攻击制作

三段攻击逻辑 基本逻辑&#xff1a; 人物点击攻击按钮进入攻击状态&#xff08;bool isAttack&#xff09; 在攻击状态下&#xff0c; 一旦设置的触发器&#xff08;trigger attack&#xff09;被触发&#xff0c;设置的计数器&#xff08;int combo&#xff09;查看目前攻击…...

PHP的线程安全与非线程安全模式选哪个

曾经初学PHP的时候也很困惑对线程安全与非线程安全模式这块环境的选择&#xff0c;也未能理解其中意。近来无意中看到一个教程对线程安全&#xff08;饿汉式&#xff09;&#xff0c;非线程安全&#xff08;懒汉式&#xff09;的描述&#xff0c;虽然觉得现在已经能够很明了透彻…...

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…...

Spring的事件监听机制

这里写自定义目录标题 1. 概述&#xff08;重点&#xff09;2. ApplicationEventMulticaster2.1 SimpleApplicationEventMulticaster2.2 AbstractApplicationEventMulticaster 3. ApplicationListener3.1 注册监听器3.2 自定义 4. SpringApplicationRunListeners 1. 概述&#…...

Zookeeper分布式命名服务实战

目录 分布式命名服务 分布式API目录 分布式节点的命名 分布式的ID生成器 分布式的ID生成器方案&#xff1a; 基于Zookeeper实现分布式ID生成器 基于Zookeeper实现SnowFlakeID算法 分布式命名服务 命名服务是为系统中的资源提供标识能力。ZooKeeper的命名服务主要是利用Z…...

DEV-C++ ege.h库 绘图教程(六)

一、前情回顾 DEV-C ege.h库 绘图教程&#xff08;一&#xff09; DEV-C ege.h库 绘图教程&#xff08;二&#xff09; DEV-C ege.h库 绘图教程&#xff08;三&#xff09; DEV-C ege.h库 绘图教程&#xff08;四&#xff09; DEV-C ege.h库 绘图教程&#xff08;五&#xff09…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...