news 2026/10/26 4:23:10

C#调用Ansys COM实现工业级仿真自动化集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#调用Ansys COM实现工业级仿真自动化集成

简介:本资源是一套面向C#开发者与Ansys仿真工程师的二次开发实践项目,聚焦于通过C#调用Ansys COM接口实现自动化建模、求解与结果获取,适用于Windows平台下的工程仿真流程定制与效率提升。压缩包共32个文件,含9个核心C#源码(如Form1.cs、Program.cs)、3个可执行程序(exe)、1个Visual Studio解决方案(sln)及配套配置文件(config)、资源文件(resx)和调试符号(pdb),完整呈现WinForm界面封装APDL命令交互的典型架构,包体仅64KB,轻量易部署。已有1565人学习下载,表明其在工业软件集成开发领域具备较强实操参考价值。读者可直接运行项目理解Ansys COM对象初始化、APDL脚本注入、模型加载与求解控制等关键环节,代码结构清晰、模块职责分明,是掌握C#驱动Ansys进行参数化仿真与批处理任务的优质入门范例。

1. C#调用Ansys:让仿真流程真正嵌入工业软件产线的“最后一公里”打通了

你有没有遇到过这种场景:某高校实验室跑通了一个基于Ansys Mechanical APDL的热应力分析流程,但交付给产线MES系统时卡在了“人工点开Ansys GUI → 手动加载模型 → 点击求解 → 导出CSV”这一步?或者某公司想把Ansys Fluent的流场结果实时喂给C#写的上位机做闭环控制,却困在COM接口文档晦涩、类型库引用失败、对象生命周期一崩就整个进程挂掉的泥潭里?这个项目就是为解决这类真实产线级集成问题而生的——它不是教你怎么在C#里画个按钮弹出Ansys窗口,而是提供一套可部署、可调试、可日志追踪、支持多实例并发调用的C#原生封装方案,覆盖Mechanical、Fluent、SpaceClaim三大核心模块。适合正在做数字孪生底座、智能产线仿真中台、CAE自动化报告系统的.NET开发者,尤其适合那些被Ansys官方SDK文档劝退三次以上、又不敢轻易上Python胶水层的工程师。


2. 技术栈与架构设计:为什么选COM而非gRPC或REST?

Ansys从19.2版本起全面启用ANSYS ACT(Application Customization Toolkit)框架,其底层通信机制早已深度绑定Windows COM组件模型。虽然官方也提供了基于gRPC的Ansys Granta MI接口和有限的REST API(仅限部分云服务),但对Mechanical/APDL/Fluent这些传统桌面端主力模块,COM仍是唯一稳定、低延迟、功能完整的调用通道。本项目没有绕开COM去造轮子,而是直面它的复杂性,用C#的System.Runtime.InteropServices做精细化封装,规避了dynamic关键字带来的运行时黑匣子问题,也避开了IDispatch裸调用的参数类型灾难。

2.1 核心依赖与版本兼容性锚点

项目严格锁定Ansys 2023 R1(v231)作为基准验证版本,这是当前企业采购主流版本,且其COM接口稳定性经过大规模产线验证。关键依赖如下:

  • Ansys.Mechanical.Application:Mechanical主应用对象,负责工程文件加载、求解器启动、结果提取
  • Ansys.Mechanical.DataModel:树形数据模型访问入口,所有边界条件、材料属性、网格设置均通过此对象操作
  • Ansys.Fluent.Gui+Ansys.Fluent.Solver:Fluent的GUI控制与求解器后台通信双通道
  • Ansys.SpaceClaim.Api.V19:SpaceClaim几何建模API,用于前处理自动化

提示:Ansys安装后,上述类型库(.tlb文件)位于C:\Program Files\ANSYS Inc\v231\aisol\Composite\winx64\ansys\等路径下,需通过Visual Studio的“添加引用 → COM → 浏览”手动导入,不能直接NuGet安装——这是踩坑第一关。

2.2 分层架构:从裸COM到业务逻辑的三层抽象

项目采用清晰的三层封装结构,避免把Ansys对象直接暴露给业务代码:

层级模块名职责关键设计
底层桥接层AnsysComBridge封装Type.GetTypeFromCLSID()、Marshal.GetActiveObject()、Marshal.ReleaseComObject()等原始COM操作所有Ansys对象创建/释放均在此层统一管理,强制实现IDisposable,杜绝内存泄漏
中间协议层MechanicalSession/FluentSession定义会话生命周期、异常重试策略、日志上下文注入每个Session对应一个独立Ansys进程实例,支持StartProcessMode = ProcessMode.Standalone(独占)或ProcessMode.Shared(复用已启动实例)
业务适配层ThermalAnalysisRunner/CFDResultExtractor封装具体分析流程:如“导入STEP→自动划分网格→施加对流边界→求解→导出温度云图PNG”接口方法全部返回Task<T>,支持异步等待,避免UI线程阻塞

这种分层让业务代码彻底摆脱COM细节。例如启动Mechanical并加载工程文件,业务层只需写:

var session = new MechanicalSession(); await session.StartAsync(ProcessMode.Standalone); await session.LoadProjectAsync(@"C:\models\gear_thermal.apdb");

而无需关心Type.GetTypeFromCLSID(new Guid("..."))或Marshal.GetActiveObject("Ansys.Mechanical.Application")这类易错代码。

2.3 进程模型与线程安全设计

Ansys COM对象不是线程安全的,且多数操作必须在STA(Single-Threaded Apartment)线程执行。项目强制要求所有Ansys调用必须在专用STA线程池中运行:

public class AnsysComBridge : IDisposable { private readonly Thread _comThread; private readonly AutoResetEvent _readyEvent = new AutoResetEvent(false); public AnsysComBridge() { _comThread = new Thread(() => { Thread.CurrentThread.SetApartmentState(ApartmentState.STA); _readyEvent.Set(); // 通知主线程STA线程已就绪 System.Windows.Forms.Application.Run(); // 启动消息循环,保持STA线程活跃 }); _comThread.IsBackground = true; _comThread.Start(); _readyEvent.WaitOne(); // 阻塞直到STA线程就绪 } public T ExecuteOnComThread<T>(Func<T> func) { var tcs = new TaskCompletionSource<T>(); _comThread.Invoke((MethodInvoker)delegate { try { tcs.SetResult(func()); } catch (Exception ex) { tcs.SetException(ex); } }); return tcs.Task.Result; // 同步等待结果(业务层感知为同步调用) } }

这段代码是项目最核心的“玄学”所在:它用WinForms的Invoke机制,在STA线程内安全执行COM调用,并将结果同步返回给调用方。很多开发者尝试用Task.Run(() => { ... })直接调用COM,结果必崩——因为默认线程是MTA(Multi-Threaded Apartment),Ansys COM根本不认。


3. 快速上手:5分钟跑通第一个Mechanical自动化分析

别被COM吓住。项目附带完整可运行Demo,按以下步骤,5分钟内就能看到C#代码驱动Ansys Mechanical完成一次静力学分析。

3.1 环境准备:三步确认,少走三天弯路

  1. Ansys安装验证:确保已安装Ansys 2023 R1(v231)完整版,且Mechanical组件勾选安装。打开命令行执行:

    "C:\Program Files\ANSYS Inc\v231\aisol\bin\winx64\AnsysWBU.exe" -b -p ansys

    若无报错并输出版本信息,则COM注册正常。

  2. Visual Studio配置:使用VS2022(.NET 6+),新建Windows Forms App (.NET)项目。右键项目 → “添加引用” → “COM”选项卡 → 勾选:

    • Ansys.Mechanical.Application
    • Ansys.Mechanical.DataModel
    • Ansys.Mechanical.Scripting
  3. 权限与UAC:Ansys COM调用需管理员权限。右键VS图标 → “以管理员身份运行”,否则Marshal.GetActiveObject会抛出COMException: 拒绝访问。

注意:Ansys安装路径含空格(如Program Files)时,务必用英文双引号包裹路径,否则PowerShell脚本调用会失败。

3.2 Demo代码解析:从零创建一个悬臂梁分析

项目Demo/BasicMechanicalDemo.cs包含一个完整案例。我们拆解最关键的三段:

① 创建Mechanical会话并加载空白工程

// 使用工厂模式获取会话实例(内部已处理STA线程) using var session = MechanicalSession.CreateStandalone(); await session.InitializeAsync(); // 启动Ansys进程并初始化 // 加载预置的apdb工程(或传入新路径) await session.LoadProjectAsync(@"C:\demo\cantilever.apdb");

InitializeAsync()内部调用AnsysWBU.exe -b -p ansys后台启动,比CreateObject("Ansys.Mechanical.Application")更可靠,避免“Ansys未启动”的竞态问题。

② 通过DataModel树设置材料与边界条件

// 获取DataModel根节点 var dataModel = session.Application.DataModel; // 查找Geometry节点并分配材料(这里假设模型已存在) var geometry = dataModel.Project.Model.Geometry; geometry.Material = "Structural Steel"; // 字符串匹配Ansys内置材料库 // 查找Fixed Support节点并施加约束 var fixedSupport = dataModel.Project.Model.Analyses[0].Setup.Supports["Fixed Support"]; fixedSupport.Location = new List<object> { "Face.1" }; // 绑定到模型面

关键点:DataModel是树形结构,所有节点名(如"Fixed Support")必须与Mechanical界面中显示的完全一致(区分大小写、空格)。项目附带DataModelExplorer.exe工具,可双击apdb文件实时查看节点路径,避免手敲错误。

③ 启动求解并导出结果

// 获取第一个分析(静力学分析) var staticAnalysis = dataModel.Project.Model.Analyses[0]; // 强制更新求解设置(避免缓存旧参数) staticAnalysis.Solve(); // 等待求解完成(轮询状态,超时10分钟) await session.WaitForSolveCompleteAsync(staticAnalysis, TimeSpan.FromMinutes(10)); // 导出变形云图PNG var result = staticAnalysis.Results["Total Deformation"]; await result.ExportImageAsync(@"C:\demo\deformation.png", width: 1920, height: 1080, format: ImageExportFormat.PNG);

WaitForSolveCompleteAsync()是血泪经验封装:它不依赖Thread.Sleep()硬等,而是轮询staticAnalysis.Status属性(值为AnalysisStatus.Solved时结束),既保证可靠性,又避免无谓等待。

3.3 运行与验证:看日志,别只盯界面

点击VS“启动”按钮运行Demo。首次运行会看到:

  • 后台静默启动Ansys Mechanical(无GUI界面,因-b参数)
  • 控制台输出类似:[INFO] Mechanical started with PID 12345
  • 10秒后生成deformation.png到指定路径

提示:若卡在WaitForSolveCompleteAsync超时,立即检查Ansys安装日志C:\Users\<user>\AppData\Local\Ansys\v231\log\mechanical.log,搜索ERROR关键词。常见原因是材料名拼错或几何体未正确命名。


4. 避坑指南:那些让开发者凌晨三点还在查MSDN的COM陷阱

COM调用Ansys不是写Hello World,是和Windows底层运行时搏斗。以下是项目团队踩过的5个高频坑,每一条都附带真实错误日志和修复代码。

4.1 现象:System.Runtime.InteropServices.COMException: 错误 HRESULT E_FAIL

原因:Ansys进程意外崩溃后,C#仍持有已失效的COM对象引用,后续调用直接抛E_FAIL。
解决:在AnsysComBridge中增加对象有效性检测:

public bool IsObjectValid(object comObj) { try { // 尝试获取对象基础属性(如Name),触发COM连接检查 var name = comObj.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, comObj, null); return true; } catch (COMException ex) when (ex.ErrorCode == unchecked((int)0x80004005)) { return false; // E_FAIL表示对象已失效 } }

业务层调用前先校验:if (!bridge.IsObjectValid(session.Application)) await session.RestartAsync();

4.2 现象:System.InvalidCastException: 无法将类型为 'System.__ComObject' 的对象强制转换为接口类型

原因:Ansys类型库(.tlb)导入时,VS自动生成的互操作程序集(Interop.*.dll)与当前Ansys版本不匹配。
解决:禁用“嵌入互操作类型”,改为显式引用:

  • 右键引用 → 属性 → “嵌入互操作类型”设为False
  • 在项目文件.csproj中添加:
    <PropertyGroup> <EmbedInteropTypes>false</EmbedInteropTypes> </PropertyGroup>

4.3 现象:System.Runtime.InteropServices.InvalidComObjectException: 无法对已释放的RCW进行操作

原因:Marshal.ReleaseComObject()被多次调用,或在Ansys进程退出后仍尝试释放。
解决:改用Marshal.FinalReleaseComObject()并加锁:

private readonly object _releaseLock = new object(); public void SafeRelease(object comObj) { if (comObj == null) return; lock (_releaseLock) { while (Marshal.ReleaseComObject(comObj) > 0) { } // 循环释放至引用计数为0 } }

4.4 现象:Fluent求解时Ansys.Fluent.Solver对象返回null,但GUI能正常操作

原因:Fluent的Solver对象需在GUI完全加载后才能获取,Application对象就绪不等于Solver就绪。
解决:增加等待GUI就绪的钩子:

public async Task WaitForFluentGuiReadyAsync() { while (true) { try { // 尝试执行一个轻量GUI命令 _fluentApp.Gui.Command("menu", "File"); break; // 成功则退出循环 } catch { await Task.Delay(500); } } }

4.5 现象:多实例并发调用时,第二个Mechanical进程报Access is denied

原因:Windows COM全局对象注册冲突,多个进程竞争同一CLSID。
解决:强制每个实例使用独立CLSID:

// 启动时指定唯一进程名 var processName = $"Mechanical_{Guid.NewGuid():N}"; var startInfo = new ProcessStartInfo { FileName = @"C:\Program Files\ANSYS Inc\v231\aisol\bin\winx64\AnsysWBU.exe", Arguments = $"-b -p ansys -name {processName}", UseShellExecute = false };

并在GetActiveObject时用processName查找:Marshal.GetActiveObject($"Ansys.Mechanical.Application.{processName}")。


5. 核心模块拆解:Mechanical DataModel操作的完整链路

DataModel是Mechanical自动化的核心,它把GUI操作转化为树形节点操作。理解DataModel结构,等于掌握Mechanical的“编程语言”。本节以“为一个装配体施加接触对”为例,逐层拆解从节点定位到参数设置的全过程。

5.1 DataModel树结构:不是XML,但胜似XML

DataModel本质是一个TreeNode集合,根节点为Project,其下固定结构为:

Project ├── Model // 几何与物理模型 │ ├── Geometry // 导入的CAD模型 │ ├── Materials // 材料库 │ ├── Connections // 连接定义(接触、螺栓等) │ └── Analyses // 分析类型(Static Structural等) ├── Engineering Data // 工程数据(材料属性表) └── Project Schematic // 项目流程图(用于多物理场耦合)

每个节点有Name(界面显示名)、InternalName(内部ID)、Children(子节点列表)三个关键属性。业务代码永远用Name定位,因为InternalName随Ansys版本变化。

5.2 定位Contact Pair节点:从模糊搜索到精确匹配

接触对在DataModel中位于Model.Connections下,但节点名可能是"Contact Region"、"Contact Pair"或用户自定义名(如"Gear_Mesh")。项目提供鲁棒搜索方法:

public ContactPair FindContactPair(string keyword = "Contact") { var connections = _dataModel.Project.Model.Connections; foreach (ContactPair cp in connections.Children) { // 先按Name模糊匹配 if (cp.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase)) { // 再验证是否真为接触对(检查是否存在Target/Contact面) if (cp.TargetLocation != null && cp.ContactLocation != null) return cp; } } throw new InvalidOperationException($"未找到包含'{keyword}'的有效Contact Pair"); }

调用示例:

var contact = FindContactPair("Gear"); // 匹配"Gear_Mesh" contact.Type = ContactType.Bonded; // 设置接触类型 contact.PinballRadius = 0.002; // 设置球半径(单位:米)

5.3 参数设置的类型安全:告别字符串硬编码

Ansys参数名(如PinballRadius)是字符串,但直接写cp.SetProperty("PinballRadius", 0.002)易出错。项目为常用节点生成强类型包装:

public class ContactPair : AnsysNode { public ContactType Type { get => (ContactType)GetProperty("Type"); set => SetProperty("Type", (int)value); } public double PinballRadius { get => (double)GetProperty("PinballRadius"); set => SetProperty("PinballRadius", value); } public List<string> TargetLocation { get => GetProperty("TargetLocation") as List<string>; set => SetProperty("TargetLocation", value); } }

GetProperty/SetProperty内部调用InvokeMember,但做了类型转换和异常包装,错误信息明确指向哪个属性名拼错。

5.4 批量操作:用LINQ操作DataModel树

DataModel支持LINQ查询,极大简化批量操作。例如:为所有Static Structural分析下的Fixed Support统一修改约束面:

var analyses = _dataModel.Project.Model.Analyses .Where(a => a.GetType().Name == "StaticStructural"); foreach (var analysis in analyses) { var supports = analysis.Setup.Supports .Where(s => s.Name.StartsWith("Fixed")) .Cast<FixedSupport>(); foreach (var support in supports) { support.Location = new List<object> { "Face.1", "Face.2" }; } }

注意:Cast<T>()需确保类型正确,否则抛InvalidCastException。项目在AnsysNode基类中提供SafeCast<T>()方法,失败时返回null而非异常。


6. 二次开发实战:把Ansys集成进你的MES/SCADA系统

现在你已掌握核心调用能力,下一步是把它变成产线可用的模块。本节以“某汽车零部件厂MES系统需在质检工位自动触发齿轮箱热变形分析”为背景,给出可直接落地的改造方案。

6.1 构建生产就绪的分析服务

不要让Ansys进程常驻——它吃内存且不稳定。应设计为“按需启动 → 执行分析 → 清理退出”的短生命周期服务:

public class ThermalAnalysisService : IHostedService, IDisposable { private Timer _timer; private readonly ILogger<ThermalAnalysisService> _logger; public ThermalAnalysisService(ILogger<ThermalAnalysisService> logger) { _logger = logger; } public Task StartAsync(CancellationToken cancellationToken) { // 每5分钟扫描MES数据库,检查是否有新质检任务 _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(5)); return Task.CompletedTask; } private async void DoWork(object state) { var tasks = GetPendingTasksFromMES(); // 从MES API拉取待分析任务 foreach (var task in tasks) { try { await RunAnalysisForTask(task); UpdateMESStatus(task.Id, "Completed"); } catch (Exception ex) { _logger.LogError(ex, "分析任务{TaskId}失败", task.Id); UpdateMESStatus(task.Id, "Failed", ex.Message); } } } private async Task RunAnalysisForTask(QualityTask task) { using var session = MechanicalSession.CreateStandalone(); await session.InitializeAsync(); // 1. 下载STEP模型(来自MES) var stepPath = await DownloadStepFromMES(task.PartId); // 2. 自动化前处理 await session.ImportGeometryAsync(stepPath); await session.AutoMeshAsync(elementSize: 0.005); // 5mm网格 // 3. 施加工艺参数(来自MES工单) await session.ApplyThermalLoadAsync( temperature: task.ProcessTemp, time: task.HoldTime); // 4. 求解并上传结果 await session.SolveAndWaitAsync(); var resultPath = await session.ExportDeformationImageAsync(); await UploadToMES(resultPath, task.Id); } }

此服务可作为.NET 6 Worker Service部署在产线服务器,通过dotnet publish -r win-x64生成独立exe,无需目标机安装.NET Runtime。

6.2 日志与可观测性:让运维不再抓瞎

Ansys内部日志分散在多个文件,项目提供统一日志聚合:

public class AnsysLogger { // 监控Ansys进程stdout/stderr public void AttachToAnsysProcess(Process ansysProcess) { ansysProcess.OutputDataReceived += (s, e) => _logger.LogInformation("[AnsysOut] {Line}", e.Data); ansysProcess.ErrorDataReceived += (s, e) => _logger.LogError("[AnsysErr] {Line}", e.Data); ansysProcess.BeginOutputReadLine(); ansysProcess.BeginErrorReadLine(); } // 解析Mechanical日志文件 public void TailMechanicalLog(string logPath) { var watcher = new FileSystemWatcher(Path.GetDirectoryName(logPath)); watcher.Filter = Path.GetFileName(logPath); watcher.Changed += (s, e) => { var lines = File.ReadLines(logPath).SkipLast(10).ToList(); foreach (var line in lines.Where(l => l.Contains("ERROR") || l.Contains("WARNING"))) _logger.LogWarning("[MechanicalLog] {Line}", line); }; watcher.EnableRaisingEvents = true; } }

配合Serilog+Seq,可实现Ansys日志与MES日志同屏比对,故障定位时间从小时级降到分钟级。

6.3 安全加固:防止Ansys成为攻击入口

Ansys COM接口若暴露在公网,可能被利用。项目强制以下安全措施:

  • 进程沙箱:Ansys进程启动时指定低权限用户:
    var startInfo = new ProcessStartInfo { UserName = "mes_worker", PasswordInClearText = "P@ssw0rd123", LoadUserProfile = false, UseShellExecute = false };
  • 输入校验:所有来自MES的参数(如STEP路径、温度值)必须白名单校验:
    if (!Regex.IsMatch(task.PartId, @"^[A-Z]{2}\d{6}$")) // 零件ID格式:AB123456 throw new SecurityException("非法零件ID格式"); if (task.ProcessTemp < -273 || task.ProcessTemp > 3000) throw new SecurityException("温度超出物理范围");
  • 超时熔断:任何Ansys操作超过15分钟自动Kill进程:
    using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(15)); await session.SolveAndWaitAsync(cts.Token);

从那以后我每次封装第三方COM组件,都强制走一遍“进程隔离→日志聚合→输入白名单→超时熔断”四步 checklist。Ansys不是玩具,是产线心脏,容不得半点侥幸。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 4:23:09

S3C2410裸机开发实战:ARM7汇编+C启动链路与外设驱动

简介&#xff1a;本资源是面向嵌入式初学者与ARM9开发者的S3C2410实战例程集&#xff0c;聚焦KEIL MDK环境下核心外设驱动开发&#xff0c;解决从理论到实操的落地难题。涵盖看门狗复位、LED GPIO控制、I2C与SPI通信协议实现、数码管动态显示等5大典型模块&#xff0c;每个例程…

作者头像 李华
网站建设 2026/10/26 4:23:08

STM32F407驱动OV7670/OV2640摄像头实战:DCMI时序对齐与DMA缓冲设计

简介&#xff1a;本资源是基于STM32F407微控制器实现USB摄像头&#xff08;UVC协议&#xff09;驱动的完整嵌入式开发项目&#xff0c;面向嵌入式初学者与进阶开发者&#xff0c;解决ARM Cortex-M4平台下视频采集、USB主机枚举、UVC类设备通信及实时图像流处理等核心问题&#…

作者头像 李华
网站建设 2026/10/26 4:22:49

解决MathType公式在Word中显示异常问题

1. 问题现象与背景分析最近在整理学术论文时遇到了一个让人头疼的问题&#xff1a;用MathType编辑的公式在Word文档中保存后&#xff0c;再次打开时公式的显示大小和占位空间发生了明显变化。原本精心排版的公式突然变得参差不齐&#xff0c;有些公式缩小到几乎看不清&#xff…

作者头像 李华
网站建设 2026/10/26 4:22:33

STM32 SBUS解析与编码实战:从收帧到回环自测

简介&#xff1a;面向无人机、机器人及遥控设备开发者的STM32 SBUS协议实现参考代码&#xff0c;聚焦Futaba S.BUS多通道遥控信号在STM32F407平台上的完整解析与编码。资源包共2个文件&#xff0c;以1个c源文件和1个h头文件为主&#xff0c;分别承载UART与DMA配置、中断处理、数…

作者头像 李华
网站建设 2026/10/26 4:22:33

Servlet处理HTTP请求的核心机制与性能优化实践

1. Servlet 客户端 HTTP 请求概述在Java Web开发中&#xff0c;Servlet作为处理HTTP请求的核心组件&#xff0c;其客户端请求处理能力直接影响着Web应用的性能和稳定性。根据最新行业数据统计&#xff0c;超过78%的Java Web应用仍在使用Servlet作为基础请求处理框架&#xff0c…

作者头像 李华
网站建设 2026/10/26 4:21:53

人工智能与机器学习核心技术解析及实战应用

1. 人工智能基础概念解析人工智能&#xff08;Artificial Intelligence&#xff09;这个术语最早由约翰麦卡锡在1956年达特茅斯会议上提出&#xff0c;指的是让机器模拟人类智能行为的科学与工程。经过六十余年的发展&#xff0c;AI已经从实验室走向日常生活&#xff0c;渗透到…

作者头像 李华