一、题目
方程组

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