news 2026/5/26 4:50:43

[C++高性能计算]-牛顿冷却定律模拟物理冷却过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[C++高性能计算]-牛顿冷却定律模拟物理冷却过程

最近学习NVIDIA官方的CUDA并行计算课程,有一个很好的例子,便跟着讲解,实现了一下,即一个物体(object)随着时间逐渐冷却的模拟过程,直接使用牛顿冷却定量进行模拟,一个对象进行计算,我们使用CPU单线程即可,后续我们尝试在大规模(>100M)数量的对象,进行CUDA加速计算。

原理

给定环境温度,求出物体当前温度与环境温度的差值,与比例系数K相乘,便能得到下一个阶段的温度。
dT(t)/dt​=−k[T(t)−Tambient​] dT(t) / dt​=−k [T(t) − Tambient​]dT(t)/dt=k[T(t)Tambient]
我们采用欧拉法离散化微分式得到:
Tnew​=Tcurrent​+k⋅(Tambient​−Tcurrent​) Tnew​=Tcurrent​+k⋅(Tambient​−Tcurrent​)Tnew=Tcurrent+k(TambientTcurrent)
假定环境温度20,目前三个对象分别温度对应42摄氏度,24摄氏度,50摄氏度,采用系数K=0.5的迭代系数。如表格,为三次时间迭代的温度结果。

时间步计算过程结果
T0T_0T0初始值42.0
T1T_1T142+0.5×(20−42)=42−1142 + 0.5 \times (20 - 42) = 42 - 1142+0.5×(2042)=421131.0
T2T_2T231+0.5×(20−31)=31−5.531 + 0.5 \times (20 - 31) = 31 - 5.531+0.5×(2031)=315.525.5

定义参数变量

floatk=0.5;// 冷却系数floatambient_temp=20;// 环境温度std::vector<float>temp(42,24,50);// 初始化三个物体的温度

数学原理的Lambda函数

为了获所有外部变量(k和ambient_temp),我们需要加上 [=],最终实现每次调用计算一个物体下一步的温度。

autoop=[=](floattemp){floatdiff=ambient_temp-temp;returntemp+k*diff;};

C++中Lambda函数是一个闭包函数,我们定义了一个op的lambda函数,[=]表示按值捕获外部所有变量,即我们在闭包函数内能够引用外部任何一个定义的变量。具体的lambda底层原理我们后续再讨论,我们用汇编代码演示具体lambda函数式怎么实现的。

迭代冷却过程

for(intstep=0;step<3;step++){print(step,temp);// 打印当前状态std::transform(temp.begin(),temp.end(),temp.begin(),op);}

我们进行三部冷却,其中计算部分我们调用了std : : transform()函数,这个函数的具体逻辑如下:

std::transform(temp.begin(),// 输入起始temp.end(),// 输入结束temp.begin(),// 输出起始(原地修改)op);// 转换函数

我们将transform函数是将temp向量中的每个元素,传入op这个lambda函数,op返回输出结果,输出结果同样传入到temp向量。更详细的说,temp.begin()返回一个迭代器,其实本质即temp向量的首个元素的泛化指针,即从temp中遍历所有元素,传入op匿名函数中,op返回的结果,逐个传入到temp.begin为初始地址的容器中去,这里即temp向量。

模拟结果

三个物体,分别是42℃,24℃,50℃的结果。

时间步物体1温度(°C)物体2温度(°C)物体3温度(°C)备注
042.024.050.0初始温度
131.022.035.0第1次冷却后
225.521.027.5第2次冷却后

尽管,少量物体进行计算模拟,性能不需要考虑,我们后续进行大规模模拟,我们进而探讨C++高性能计算的实现。

完整代码

```c#include<iostream>#include<vector>#include<algorithm>intmain(){floatk=0.5;floatambient_temp=20;std::vector<float>temp={42.0,24.0,50.0};autoop=[=](floattemp_val){returntemp_val+k*(ambient_temp-temp_val);};std::cout<<"步数 | 温度[0] | 温度[1] | 温度[2]"<<std::endl;std::cout<<"----------------------------------"<<std::endl;for(intstep=0;step<3;step++){std::cout<<step<<" | ";for(floatt:temp){std::cout<<t<<" ";}std::cout<<std::endl;std::transform(temp.begin(),temp.end(),temp.begin(),op);}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 8:34:54

西安交通大学LaTeX论文模板:高效排版终极指南

在学术写作的征途中&#xff0c;西安交通大学官方推出的学位论文LaTeX模板为研究生们提供了强大的排版支持。这个LaTeX模板严格遵循学校最新的格式规范&#xff0c;让论文格式问题不再成为学术创作的障碍&#xff0c;助你专注于核心研究内容。 【免费下载链接】XJTU-thesis 西安…

作者头像 李华
网站建设 2026/5/25 1:13:07

现代图片浏览器的智能事件响应架构探析

在当今Web应用开发中&#xff0c;动态图片内容的交互处理一直是技术难点。传统的事件绑定模式在面对频繁更新的图片元素时&#xff0c;往往陷入性能瓶颈和内存泄漏的困境。本文将通过剖析ViewerJS的设计理念&#xff0c;揭示一种创新的智能事件响应架构&#xff0c;为现代图片浏…

作者头像 李华
网站建设 2026/5/26 0:38:47

EmotiVoice语音合成在婚礼司仪语音定制中的浪漫呈现

EmotiVoice语音合成在婚礼司仪语音定制中的浪漫呈现 在一场婚礼上&#xff0c;当父亲的声音缓缓响起&#xff1a;“孩子&#xff0c;看到你成家立业&#xff0c;爸爸真的很高兴……”全场宾客动容。可这位父亲其实并未到场——他的“声音”来自一段几秒钟的录音&#xff0c;通过…

作者头像 李华
网站建设 2026/5/25 23:41:18

如何训练自己的情感语音模型?从EmotiVoice开始

如何训练自己的情感语音模型&#xff1f;从 EmotiVoice 开始 在虚拟主播的直播间里&#xff0c;一句“家人们谁懂啊”可以带着夸张的惊喜脱口而出&#xff1b;而在心理陪伴机器人的轻声细语中&#xff0c;“我在这里陪着你”又需要透出温柔与共情。同样是文字转语音&#xff0c…

作者头像 李华
网站建设 2026/5/25 13:51:18

OpenUSD场景导出终极指南:一键实现USDZ与glTF格式转换

在3D内容创作与分发日益普及的今天&#xff0c;OpenUSD作为通用场景描述框架&#xff0c;其强大的场景组合能力为数字内容管理提供了全新解决方案。然而在实际工作流中&#xff0c;如何高效完成USDZ与glTF两种主流格式的转换&#xff0c;成为众多开发者面临的技术挑战。本文将为…

作者头像 李华
网站建设 2026/5/25 21:50:19

12306抢票终极指南:从零构建自动化购票系统

还在为春运抢票发愁吗&#xff1f;你可能会遇到这样的困境&#xff1a;手动刷新12306网站&#xff0c;验证码识别困难&#xff0c;提交订单时票已售罄。今天&#xff0c;让我们来试试一种全新的解决方案——基于Python的自动化抢票系统。 【免费下载链接】12306 12306智能刷票&…

作者头像 李华