Как построить мое дифференциальное уравнение с колчаном? - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу решить свое дифференциальное уравнение и построить векторы скорости, но у меня возникли некоторые проблемы с этим.Я попытался это:

syms y(x);
ode = (1+exp(x))*y*diff(y,x)-2*exp(x) == 0;
ySol = dsolve(ode)

[X,Y] = meshgrid(-2:.2:2);
Z = 2*exp(X)/((1+exp(X)).*Y);
[DX,DY] = gradient(Z,.2,.2);

figure
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
hold off

, и я получаю эту ошибку:

Warning: Matrix is singular to working precision. 
Warning: Contour not rendered for non-finite ZData 

Это, вероятно, что-то простое, что я не вижу, но я только начинаю использовать Matlab, и я не могу найтиправильный способ сделать мою задачу.Пожалуйста, помогите мне ...

РЕДАКТИРОВАТЬ

Как предложил bconrad, я изменил свою функцию Z следующим образом:

Z = 2*exp(X)/((1+exp(X)).*Y);

, и предыдущие ошибки были исправлены.Тем не менее, моя главная цель, чтобы построить векторы скорости, еще не достигнута, потому что я получаю такой график: enter image description here

1 Ответ

0 голосов
/ 01 октября 2018

В данный момент у меня нет возможности проверять, но я считаю, что вы хотите разделить элемент на эту строку.Вы пропускаете точку в подразделении, попробуйте

Z = 2*exp(X)./((1+exp(X)).*Y);

Я однажды поближе посмотрел на свою станцию.Нулевое деление, упомянутое Пабло, заставляет inf в Z, поэтому колчан запутывается при масштабировании векторов (понятно) и просто не показывает их.Попробуйте это (с удаленной частью ode):

[X,Y] = meshgrid(-2 : .2 : 2);
Z = 2 * exp(X) ./ ((1 + exp(X)) .* Y);
Z(isinf(Z)) = nan; % To avoid 0-division problems
[DX, DY] = gradient(Z, .2, .2);

figure
contour(X, Y, Z, 30, 'k')
hold on
quiver(X, Y, DX, DY, 6)
hold off

Я сделал 3 вещи здесь:

  1. Добавлена ​​строка Z(isinf(Z)) = nan;, заставляющая бесконечные значения игнорироватьсяquiver
  2. Добавил аргументы 30, 'k' в функцию контура, чтобы показать 30 строк, и сделать их черными (чуть более заметными)
  3. Добавил аргумент 6 в функцию колчана,Это отменяет автоматическое масштабирование по длине векторов.

Вы захотите поиграть с аргументами функций contour и quiver, чтобы ваша фигура выглядела так, как вам хочется.

PS: На обмене файлами есть удобная функция arrow, которая, как мне кажется, дает лучший контроль при создании графиков векторных полей.См. https://www.mathworks.com/matlabcentral/fileexchange/278-arrow - рейтинги делают это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...