Matlab微分方程符号解转数值绘图问题及fplot用法咨询
Hey there, I see you're stuck on plotting symbolic solutions from your differential equation in MATLAB—let's get this sorted out properly, including handling complex numbers if needed.
What's Going Wrong?
The Error using plot message happens because symbolic expressions aren't numeric arrays, which is what plot expects. When you tried vpa(xSol), you just converted symbolic constants to high-precision values, but t is still a symbolic variable—so xSolvpa is still a symbolic expression, not a numeric dataset. That's why fplot ran but gave wonky results.
Two Solid Solutions (Both Support Complex Numbers)
Option 1: Use fplot Directly (Simplest for Symbolic Functions)
fplot is built to handle symbolic expressions directly, no conversion needed. It also supports complex functions—by default, it plots the real part, but you can easily plot imaginary parts, magnitudes, or phase angles too.
Here's how to apply it to your problem:
% Define symbolic variable and your analytical solutions syms t xSol = exp(-3*t) + t*exp(-3*t); ySol = t*exp(-3*t); % Plot xSol over your desired t range fplot(xSol, [-1.1 2.1], '.-', 'DisplayName','x(t) (Real Part)'); hold on; % For complex solutions, uncomment lines to plot other components: % fplot(imag(xSol), [-1.1 2.1], '--', 'DisplayName','x(t) (Imaginary Part)'); % fplot(abs(xSol), [-1.1 2.1], ':', 'DisplayName','x(t) (Magnitude)'); % Add ySol to the plot fplot(ySol, [-1.1 2.1], 'r.-', 'DisplayName','y(t)'); % Clean up the plot grid on; legend; hold off;
Option 2: Convert to Numeric Arrays (For Full Control Over Sampling)
If you want to use your exact t sampling grid (t=-1.1:0.1:2.1), you need to convert the symbolic expressions to numeric values. You have two reliable ways to do this:
Method A: Use subs to Plug in Numeric t Values
subs replaces the symbolic t with your numeric array, giving you a corresponding numeric solution (works for complex numbers automatically):
syms t xSol = exp(-3*t) + t*exp(-3*t); ySol = t*exp(-3*t); % Define your custom t sampling points t = -1.1:0.1:2.1; % Convert symbolic expressions to numeric arrays xNum = subs(xSol, t); yNum = subs(ySol, t); % Plot—for complex data, pick which component to show plot(t, real(xNum), '.-', 'DisplayName','x(t) (Real Part)'); hold on; plot(t, real(yNum), 'r.-', 'DisplayName','y(t)'); % Uncomment for imaginary parts: % plot(t, imag(xNum), '--', 'DisplayName','x(t) (Imaginary Part)'); grid on; legend; hold off;
Method B: Convert to an Anonymous Function (Faster for Large Datasets)
matlabFunction turns your symbolic expression into a reusable anonymous function that accepts numeric inputs. This is great if you're going to compute the solution multiple times:
syms t xSol = exp(-3*t) + t*exp(-3*t); ySol = t*exp(-3*t); % Convert symbolic solutions to anonymous functions xFunc = matlabFunction(xSol); yFunc = matlabFunction(ySol); % Define your t sampling grid t = -1.1:0.1:2.1; % Compute numeric values (supports complex numbers) xNum = xFunc(t); yNum = yFunc(t); % Plot as before plot(t, real(xNum), '.-', 'DisplayName','x(t) (Real Part)'); hold on; plot(t, real(yNum), 'r.-', 'DisplayName','y(t)'); grid on; legend; hold off;
Why Your vpa Approach Failed
vpa(xSol) only replaces symbolic constants (like the 3 in exp(-3*t)) with high-precision numbers—it doesn't substitute your numeric t values. So xSolvpa stays a symbolic expression with t still as a variable. fplot can technically handle this, but it doesn't use your custom sampling grid, leading to unexpected plots. Stick to the methods above for consistent results.
Handling Complex Solutions
If your differential equation had complex roots (leading to complex solutions), all the methods above work seamlessly:
- Use
real(),imag(),abs(), orangle()to plot specific components of the complex solution. - Both
fplotand numeric conversion will preserve complex values automatically—you just choose what to visualize.
内容的提问来源于stack exchange,提问作者Mary A. Marion

