为什么我的方程(y'=(3 * x ^ 3-y)/(3 * x))不能用我的绘图函数正确地位移?

时间:2018-10-07 20:29:53

标签: matlab plot differential-equations

我正在尝试绘制微分方程的解,但是用这种方法我无法获得正确的图形。根据Desmos的说法,我的功能应如下所示:

my function

这是我的代码:

clear
syms Y(X)
ode = diff(Y,X) == (3.*X.^3-Y)./(3.*X);
cond = Y(1) == 5;
YSol(X) = dsolve(ode, cond)
[X,Y] = meshgrid(-5 : .2 : 5);
Z = @(X,Y)(3.*X.^3-Y)./(3.*X);
dirfield(Z,-10:0.5:10,-10:0.5:10)
hold on;
[Xs,Ys] = ode45(Z,[-1,10],5); plot(Xs,Ys)
hold off

这是函数目录字段:2

function dirfield(f,tval,yval)
% dirfield(f, t1:dt:t2, y1:dy:y2)
%   
%   plot direction field for first order ODE y' = f(t,y)
%   using t-values from t1 to t2 with spacing of dt
%   using y-values from y1 to t2 with spacing of dy
%
%   f is an @ function, or an inline function,
%     or the name of an m-file with quotes.
%
% Example: y' = -y^2 + t
%   Show direction field for t in [-1,3], y in [-2,2], use
%   spacing of .2 for both t and y:
%
%   f = @(t,y) -y^2+t
%   dirfield(f, -1:.2:3, -2:.2:2)

[tm,ym]=meshgrid(tval,yval);
dt = tval(2) - tval(1); 
dy = yval(2) - yval(1);
fv = vectorize(f);
if isa(f,'function_handle')
  fv = eval(fv);
end
yp=feval(fv,tm,ym); 
s = 1./max(1/dt,abs(yp)./dy)*0.35;
h = ishold;
quiver(tval,yval,s,s.*yp,0,'.r'); hold on;
quiver(tval,yval,-s,-s.*yp,0,'.r');
if h
  hold on
else
  hold off
end
axis([tval(1)-dt/2,tval(end)+dt/2,yval(1)-dy/2,yval(end)+dy/2])

有人知道我做错了吗?预先谢谢你。

编辑:

Desmos中的图形具有混合轴,但是我的问题不在那。我不明白为什么会得到这张图片:

image

代替Desmos图形逆时针旋转(或类似的东西)。

Maybie我需要的是其他绘图功能?

1 个答案:

答案 0 :(得分:1)

这是一阶线性ODE,在x = 0处具有奇点,离y轴无任何折叠点。确实,解决方案是通过整合获得的

(x^(1/3)*y)' = x^(7/3)

这样

(x^1/3)*y = 3/10*x^(10/3) + C  <==> y(x)  =  10/3*x^3 + C*x^(-1/3)

,其中某些表达式包含大的积分常数C。如果您打印dsolve的结果,也应该是结果。

您包含的图形用于另一个问题。

或者图形交换了轴,这是一个y-x图。对于初始条件y(1)=5,将得到C=5/3,并且得到一个镜像到对角线上的图形。


要在初始条件y(1)=5的两侧绘制解决方案,您需要积分并绘制两次。一次用于时间范围[1 5],一次用于[1 0.1]。解的最大域是(0,infinity),没有解,因此没有用于负x的图。例如对于初始条件y(-1)=-5,那将是另一种解决方案。