我想在不使用y^2=x^2(x+3)
或使用代数查找函数的每个分支的情况下在MATLAB中绘制ezplot
之类的关系。
有谁知道我怎么做到这一点?我通常会创建一个linspace
,然后在linspace
上创建一个函数。例如
x=linspace(-pi,pi,1001);
f=sin(x);
plot(x,f)
我可以为我提供的关系做类似的事情吗?
答案 0 :(得分:4)
你可以做的是使用solve
并允许MATLAB的符号解算器以y
的形式象征性地求解x
的表达式。完成此操作后,您可以使用subs
将x
的值替换为solve
中找到的表达式,并将所有这些值一起绘制。请记住,您需要使用subs
投射double
的结果,因为您需要替换的数字结果。不这样做仍然会以MATLAB的符号格式留下答案,当你想在图表上绘制最终点时,它是不兼容的。
此外,您需要做的是给定的方程式,例如您在上面发布的方法,您可能需要遍历每个解决方案,将x
的值替换为每个,然后将它们添加到绘图中。
如下所示。在这里,您还可以根据需要控制域名:
syms x y;
eqn = solve('y^2 == x^2*(x+3)', 'y'); %// Solve for y, as an expression of x
xval = linspace(-1, 1, 1000);
%// Spawn a blank figure and remember stuff as we throw it in
figure;
hold on;
%// For as many solutions as we have...
for idx = 1 : numel(eqn)
%// Substitute our values of x into each solution
yval = double(subs(eqn(idx), xval));
%// Plot the points
plot(xval, yval);
end
%// Add a grid
grid;
特别注意我如何使用solve
。我指定了y
,因为我想解决y
,这会给我一个x
的表达式。 x
是我们的自变量,所以这很重要。然后我指定一个从{1}到-1的x
点网格 - 实际上恰好是1000个点。我产生一个空白数字,然后对于我们所拥有的等式的尽可能多的解,我们确定每个解决方案的输出y
值,我们给出了我之前做出的x
值。然后我将这些点绘制在这些点的图表上。请注意,我使用hold on
为每个plot
调用添加了更多的点数。如果我没有这样做,那么这个数字会刷新,只记得最近对plot
的调用。您希望将所有点都放在此处从所有解决方案生成。为了一些整洁,我扔了一个网格。
这就是我得到的:
答案 1 :(得分:4)
好的,我正准备写下我的答案,我刚看到@rayryeng提出了类似的想法(好工作Ray!)但是就在这里。这个想法也是使用solve来获取y的表达式,然后将符号函数转换为匿名函数然后绘制它。该代码适用于您从解决方案中获得的任何数量的解决方案:
clear
clc
close all
syms x y
FunXY = y^2 == x^2*(x+3);
%//Use solve to solve for y.
Y = solve(FunXY,y);
%// Create anonymous functions, stored in a cell array.
NumSol = numel(Y); %// Number of solutions.
G = cell(1,NumSol);
for k = 1:NumSol
G{k} = matlabFunction(Y(k))
end
%// Plot the functions...
figure
hold on
for PlotCounter = 1:NumSol
fplot(G{PlotCounter},[-pi,pi])
end
hold off
结果如下:
答案 2 :(得分:2)
n = 1000;
[x y] = meshgrid(linspace(-3,3,n),linspace(-3,3,n));
z = nan(n,n);
z = (y .^ 2 <= x .^2 .* (x + 3) + .1);
z = z & (y .^ 2 >= x .^2 .* (x + 3) - .1);
contour(x,y,z)
这可能不是你想要的,但我很酷!