用MATLAB r2010b和r2016b求解微分方程组

一、题目

方程组

初值条件:y(0)=3, x(0)=1

自变量:z;未知函数:x(z), y(z)

二、版本差异说明

  1. R2016b :支持syms x(z)声明符号函数;方程使用==等式;方程组、初值条件可以用数组批量传入。
  2. R2010b :无符号函数声明语法,微分方程必须写成字符串;Dy、Dx表示对自变量z求导;最后一个参数显式指定自变量'z'。
  3. 两个版本得到的解析解数学结果完全相同。

三、符号变量 vs 符号函数

1.syms x y ✅ MATLAB R2010b 完全支持 这里的 x、y 只是普通符号未知数(代数方程的变量,不是函数),没有和自变量绑定。

2.syms x(z) ❌ R2010b 不支持 这个语法叫符号函数声明:含义是:x是自变量z的函数 x(z)。

这个语法是R2013b 之后版本新增 ,R2010b 的旧符号引擎没有这个语法。微分方程组题目中,x,y是关于z的函数 x(z), y(z),所以不能写syms x(z) y(z),只能用字符串形式传给dsolve。

四、代码实现

MATLAB R2016b(新版语法,支持syms x(z) y(z))

Matlab 复制代码
% MATLAB R2016b
syms x(z) y(z)
eq1 = diff(y,z) == 2*x +5;
eq2 = diff(x,z) == 4*y -3;
cond1 = y(0)==3;
cond2 = x(0)==1;
sol = dsolve([eq1,eq2],[cond1,cond2]);

disp('==== R2016b 求解结果 ====');
pretty(sol.y);
pretty(sol.x);

MATLAB R2010b(旧版,不支持syms x(z),必须字符串写法)

Matlab 复制代码
% MATLAB R2010b 微分方程组,字符串格式
eq1 = 'Dy = 2*x +5';
eq2 = 'Dx = 4*y -3';
cond1 = 'y(0)=3';
cond2 = 'x(0)=1';
sol = dsolve(eq1,eq2,cond1,cond2,'z');

disp('==== R2010b 求解结果 ====');
pretty(sol.y);
pretty(sol.x);

如果想得到简洁的表达式,可以在代码末尾加上simplify:

Matlab 复制代码
simplify(sol.y)
simplify(sol.x)

会把复杂的分式根号合并,输出可读性更高的解析解。

五、R2010b pretty()排版错位问题说明与解决方案

R2010b 的pretty输出会出现排版错位,属于 ASCII 打印格式问题,计算结果本身正确。

根源:R2010b 的 pretty() 是纯 ASCII 文本模拟数学公式,没有图形渲染 。遇到根号、多层分式、指数项时,字符对齐错乱。✅ 重点:这只是屏幕显示效果差,符号解的计算结果本身完全正确。 ⚠️ 没有办法彻底修复pretty函数本身,属于版本底层限制。

方案 1:使用latex()生成 LaTeX 公式(强烈推荐)

R2010b 自带latex()函数,可以把符号解转为标准 LaTeX 公式字符串。复制输出的代码,粘贴到 Word 的【插入→公式】编辑器,就能渲染出整洁美观的数学公式。

完整可运行代码(对应我们的微分方程组)

Matlab 复制代码
eq1 = 'Dy = 2*x + 5';
eq2 = 'Dx = 4*y - 3';
cond1 = 'y(0)=3';
cond2 = 'x(0)=1';
[y,x] = dsolve(eq1,eq2,cond1,cond2,'z');

y_s = simplify(y);
x_s = simplify(x);

disp('y(z) LaTeX代码:');
latex(y_s)
disp('x(z) LaTeX代码:');
latex(x_s)

运行后输出一串类似:

Matlab 复制代码
\frac{\sqrt{2}\, \left(7\, \sqrt{2} - 9\right)}{8\, \mathrm{e}^{2\, \sqrt{2}\, z}} + \frac{\sqrt{2}\, \mathrm{e}^{2\, \sqrt{2}\, z}\, \left(7\, \sqrt{2} + 9\right)}{8} - \frac{5}{2}

复制整段,粘贴到 Word 公式框,回车直接生成标准数学公式。

方案 2:命令行查看:放弃pretty,直接输出化简后的符号表达式

不调用pretty,直接输出simplify结果,不会出现排版错位。缺点是命令窗口为一长行,阅读体验一般。

Matlab 复制代码
eq1 = 'Dy = 2*x + 5';
eq2 = 'Dx = 4*y - 3';
cond1 = 'y(0)=3';
cond2 = 'x(0)=1';
[y,x] = dsolve(eq1,eq2,cond1,cond2,'z');

y_s = simplify(y);
x_s = simplify(x);

disp('y(z)化简结果:');
y_s
disp('x(z)化简结果:');
x_s

六、R2010b 字符串模式下的 dsolve 有一个经典坑:输出结果的顺序,是按照 变量名字母字典序返回。

  • 变量字母顺序:x 在 y 的前面。
  • 所以 dsolve(...) 返回的第 1 个解是 x(z),第 2 个解是 y(z)。
相关推荐
Sarvartha2 小时前
final 关键字
java·开发语言
yi0113 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday3 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
zhangzeyuaaa4 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
谢亮_vipxieliang5 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
思无邪665 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
灯澜忆梦5 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下5 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J6 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛6 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法