Найти корень неявной функции в Mathematica - PullRequest
0 голосов
/ 09 сентября 2011

Найти корень неявной функции в Mathematica

У меня есть неявная функция, например:

f(x,y) = x^3 + x*y + y^2 - 36

Я хочу найти корень, то есть решения дляуравнение f(x,y) = 0

Рисовать решение легко:

ContourPlot[x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]

однако я хотел бы иметь данные, которые есть на графике, а не только визуальныесюжет.Так как мне найти данные сюжета?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Я не уверен, правильно ли я интерпретирую ваш второй вопрос, но при условии, что вам требуется список (x, y) точек из сгенерированного ContourPlot, один из способов сделать это может быть следующим:

plot = ContourPlot[
  x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]

Для получения списка баллов

points = Cases[Normal@plot, x_Line :> First@x, Infinity];

«Взгляните» с ListPlot

ListPlot[points, PlotRange -> {{-2 Pi, 2 Pi}, {-3 Pi, 3 Pi}}]

1010 * дает *

enter image description here

Редактировать

Насер правильно указал, что этот вопрос уже рассматривался ранее. Здесь - это одна ссылка, по сути, на тот же вопрос, и этот ответ от Szabolcs является актуальным.

Что касается ответа, приведенного выше, этот метод , вероятно, более прямой:

points2 = Cases[plot, x_GraphicsComplex :> First@x, Infinity]

Наконец, я должен признать «LunchTime Playground. Fun с Mathematica: Как извлечь точки из графика», см. здесь , что дает оба метода, предложенных выше (и которые я сейчас пользуюсь рутинно).

Редактировать 2

Этот метод является усовершенствованием вышеописанного метода 1, поскольку точки получаются в виде списка значений {x, y} (list-of-lists) без каких-либо посторонних {}.

Cases[Normal@plot, Line[{x__}] :> x, Infinity]

Статья Пола Эбботта в Mathematica Journal, том 7, № 2, с. 108-112, 1998, Поиск корней в интервале , дает много полезной информации и доступен здесь

Он указывает на следующее также работают

Cases[Normal@plot, _Line, -1][[1, 1]]

и (!)

plot[[1, 1]]

Я сделал ссылку в комментариях на вопрос от FreshApple, где можно найти (небольшой вариант) следующего метода:

InputForm[plot][[1, 1, 1]]

Следующее оценивается как True

plot[[1, 1]] == Cases[Normal@plot, Line[{x__}] :> x, Infinity] == 
 InputForm[plot][[1, 1, 1]] == Cases[Normal@plot, _Line, -1][[1, 1]]

Редактировать 3

Просто или весело ...

ListPlot@ContourPlot[x^2 + y^2 == 1, {x, -1, 1}, {y, -1, 1}][[1, 1]]

дает

enter image description here

3 голосов
/ 09 сентября 2011

Вклад в размере 0,02 доллара на ответ Вербеи:

Не забудьте проверить оба решения x (y) и y (x), поскольку одно из них может быть чище другого.

В вашем примере:

enter image description here

3 голосов
/ 09 сентября 2011

Я бы рекомендовал вам изучить документацию по решению уравнений и, в частности, Решить и NSolve .

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

p = ContourPlot[x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]
p //InputForm

Скопируйте и вставьте нужный бит.

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

sol = Solve[x^3 + x*y + y^2 - 36 == 0,{x}][[1]] 

Выможет потребоваться несколько вариантов, чтобы получить правильное решение.

Table[{x/. sol,y},{y, -3 Pi, 3 Pi, 0.02}]
...