Как построить решения набора уравнений в Mathematica?

Как построить решение набора уравнений в Mathematica? Даже если есть только две переменные, эти уравнения достаточно сложны, чтобы их нельзя было переставить так, чтобы одна из переменных могла быть установлена ​​равной функции другой (и, таким образом, иметь правильную форму для Plot).

Конкретный пример, который меня интересует, следующий:

  • Исправьте a b в (0,1).
  • Пусть g >= 1 и d >= 1 различаются.
  • Тогда существует уникальный x (который оказывается в (0,1]) такой, что x = [(b x + 1) / (x + g)]^d (доказательство опущено).
  • Мне нужен график пар (d, g), что (1 - b g) x d / [(b x + 1) (x + g)] = 1.

person Tyson Williams    schedule 26.07.2011    source источник
comment
Можете ли вы привести упрощенный пример ваших уравнений? Сколько переменных и сколько уравнений?   -  person Simon    schedule 27.07.2011
comment
Каждое уравнение является функцией двух переменных, верно? Вы можете Plot3D[] использовать эту функцию. Вы также можете Plot3D несколько уравнений на одном и том же графике, хотя в зависимости от того, на что похожи уравнения, они могут или не могут быть читаемыми/полезными.   -  person Daniel Chisholm    schedule 27.07.2011
comment
@Simon привел конкретный пример.   -  person Tyson Williams    schedule 01.08.2011
comment
@Daniel Chisholm Можно решить переменную и свести проблему к двум переменным. Однако это не проблема 3D. Либо двумерная точка удовлетворяет уравнению, либо нет, поэтому третье измерение — это только бинарное включение/выключение.   -  person Tyson Williams    schedule 01.08.2011
comment
@Tyson Если у вас есть lefthandside(x,y) = righthandside(x,y), то вас интересует трехмерный график Z = lefthandside(x,y)-righthandside(x,y), который определенно не просто 0 или 1. Однако вас интересует фрагмент графика, где Z = 0. Я уверен, что вы можете взять его отсюда; Я давно не пользовался математикой   -  person Brian Gordon    schedule 02.08.2011
comment
@ Брайан Гордон Конечно, одна из причин более низкого измерения с точки зрения более высокого, но без каких-либо оправданий, это педантично. Следует избегать обобщения ради обобщения.   -  person Tyson Williams    schedule 03.08.2011


Ответы (2)


Я предполагаю, что вы ищете какой-то элегантный метод, но сейчас вот как его переборщить:

Clear[findx];findx[d_,g_,b_]:=x/.First@FindRoot[x\[Equal]((b x+1)/(x+g))^d,{x,0,1},PrecisionGoal\[Rule]3]
ClearAll[plotQ];
plotQ[d_,g_,b_,eps_]:=Module[
    {x=findx[d,g,b]},
    Abs[(1-b g) x d/((b x+1) (x+g))-1.]<eps]

tbl=Table[{d,g,plotQ[d,g,.1,.001]},{d,4,20,.05},{g,1,1.12,.001}];

(это должно занять порядка 10 секунд). Затем нарисуйте точки следующим образом:

Reap[
    Scan[
        If[#[[3]] == True,
            Sow@Point[{#[[1]], #[[2]]}]] &,
            Flatten[tbl, 1]]] // Last // Last // 
 Graphics[#, PlotRange -> {{1, 20}, {1, 1.1}}, Axes -> True,
    AspectRatio -> 1, AxesLabel -> {"d", "g"}] &

введите здесь описание изображения

Уж больно уродливый способ сделать это, но он есть.

Обратите внимание, что я просто быстро написал это, поэтому я не гарантирую, что это правильно!

РЕДАКТИРОВАТЬ: Вот как это сделать, указав только b и размер шага для d:

Clear[findx]; 
findx[d_, g_, b_] := 
 x /. First@
   FindRoot[x \[Equal] ((b x + 1)/(x + g))^d, {x, 0, 1}, 
    PrecisionGoal \[Rule] 3]
ClearAll[plotQ];
plotQ[d_, g_, b_, eps_] := 
 Module[{x = findx[d, g, b]}, 
  Abs[(1 - b g) x d/((b x + 1) (x + g)) - 1.] < eps]

tbl = Table[{d, g, plotQ[d, g, .1, .001]}, {d, 4, 20, .05}, {g, 1, 
    1.12, .001}];

ClearAll[tmpfn];
tmpfn[d_?NumericQ, g_?NumericQ, b_?NumericQ] := 
 With[{x = findx[d, g, b]},
    (1 - b g) x d/((b x + 1) (x + g)) - 1.
  ]

тогда

stepsize=.1

(tbl3=Table[
    {d,g/.FindRoot[tmpfn[d,g,.1]\[Equal]0.,
        {g,1,2.},PrecisionGoal\[Rule]2]},
    {d,1.1,20.,stepsize}]);//Quiet//Timing

ListPlot[tbl3,AxesLabel\[Rule]{"d","g"}]

давать

введите здесь описание изображения

person acl    schedule 01.08.2011
comment
Не волнуйтесь, я не пытаюсь выиграть здесь конкурс красоты. Кроме того, это тип кривой, который я ожидаю. Однако я не могу сказать, какое значение b вы выбрали для этого графика. Возможно, вы рисуете все тройки (d, g, b), но отбрасываете координату b? - person Tyson Williams; 02.08.2011
comment
@Tyson b — третий аргумент plotQ; если вы посмотрите на то, что установлено tbl, b=.1. Кстати, то, как я это написал, довольно сложно понять (это быстрая и грязная реализация, которую я написал, не задумываясь). Если вы что-то не понимаете, спрашивайте (на самом деле мне нужно было это исправить, но у меня не было много времени). - person acl; 02.08.2011
comment
Хорошо, а как насчет этого улучшения? Вы говорите, что это просто грубая сила. Кажется, что вы просто просматриваете все пары (d, g) (для фиксированного b) в 2D-решетке и наносите истинные точки. Как следует из сюжета, я ожидаю, что истинные точки будут формировать функцию в d. Можете ли вы улучшить его, чтобы нужно было указывать только диапазон и размер шага для d? - person Tyson Williams; 02.08.2011
comment
@Tyson Да, вы правильно поняли: я просто вычисляю, какие точки на решетке являются True, а затем рисую их. - person acl; 02.08.2011
comment
@Tyson смотрите редактирование. Вы действительно пытаетесь упростить это аналитически? - person acl; 02.08.2011
comment
Не аналитически, а только символически. - person Tyson Williams; 02.08.2011
comment
@acl позвольте нам продолжить это обсуждение в чате - person Tyson Williams; 02.08.2011
comment
@ Тайсон Я сделал; в любом случае я нашел глупую ошибку (я оставил в Abs; я удалил его, и теперь он работает нормально для всех ваших значений) - person acl; 02.08.2011
comment
Я думаю, что второй параметр FindRoot должен быть {x, 0,5, 0, 1} (где 0,5 может быть любым значением от 0 до 1), чтобы найти корень для x между 0 и 1. - person Tyson Williams; 05.08.2011
comment
@Tyson, да, это ограничивает диапазон. Я просто задавал начальные условия и старался не использовать производные (предполагая, что так будет быстрее, хотя в итоге не проверял) - person acl; 05.08.2011
comment
Проблема в том, что мне нужен x в [0,1]. Кажется, это происходит при построении графика g против d, но мой друг хотел увидеть g / x против d, и я думаю, что x за пределами [0,1] возвращались. - person Tyson Williams; 05.08.2011
comment
@Tyson использует FindRoot, как вы сказали, например, FindRoot[Cos[x], {x, 0.5, 0, 1}], не всегда возвращает x в [0,1]? - person acl; 05.08.2011
comment
Это то, что говорится в документации, так что, вероятно, так и есть. На наших графиках, поскольку мы делим на x, что очень мало, поэтому небольшие различия в возвращаемом значении вызывают очень большие различия. Эта конкретная проблема, вероятно, больше не вызывает большого беспокойства, потому что графики g и d показывают, что наш подход к решению проблемы не работает. Еще раз спасибо всем за помощь. - person Tyson Williams; 10.08.2011

Вы хотите использовать ContourPlot.

http://reference.wolfram.com/mathematica/ref/ContourPlot.html

Вы также можете использовать ImplicitPlot, но он устарел:

http://reference.wolfram.com/legacy/v5_2/Add-onsLinks/StandardPackages/Graphics/ImplicitPlot.html

person Brian Gordon    schedule 26.07.2011
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но похоже, что обе функции работают только с одним уравнением. - person Tyson Williams; 27.07.2011
comment
@Tyson взгляните на третью команду в желтом поле в верхней части ContourPlot. - person Brian Gordon; 27.07.2011
comment
Да, но в разделе «Дополнительная информация» говорится, что ContourPlot накладывает контурные линии, связанные со всеми равенствами о третьей команде, что означает, что countour содержит точку, если это решение ЛЮБОГО уравнения, а не то, что я ищу , то есть множество точек, являющихся решениями ВСЕХ уравнений. - person Tyson Williams; 01.08.2011