Пересечение или Решить - PullRequest
       9

Пересечение или Решить

4 голосов
/ 15 октября 2011

Рассмотрим следующее:

daList = {{541, 0.0593368}, {550, 0.298352}, {560, 0.72619}, {570,0.734982}, 
          {580, 1.46149}, {590, 2.31119}, {600, 3.31509}}

Каждый подсписок представляет координату {x, y}.

Мне нужно найти значение x, для которого Y равно 1. Примерно 575 с глазом.

ListPlot[daList, 
        Joined -> True, 
        Epilog ->{Thick, Line[{{0, 1}, {600, 1}}]}]

+ Помощь от PPT для красных частей, чтобы проиллюстрировать вопрос:

enter image description here

Может интерполировать, пока не найду 1, но я хочу знать, существует ли функция для этого в Mathematica.

Либо расчет. Найдите X, для которого y = 1. Или, может быть, графическая, в которой координата x пересечения линии сообщается по оси x.

Ответы [ 4 ]

8 голосов
/ 15 октября 2011
f = Interpolation[daList];
r = FindRoot[Evaluate[f][x] - 1, {x, 570, 541, 600}]
Show[Plot[{f[x], 1}, {x, 541, 600}], Graphics@Line[{{x, 0}, {x, 1}}] /. r]

enter image description here

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

С легендой:

f = Interpolation[daList];
r = FindRoot[Evaluate[f][x] - 1, {x, 570, 541, 600}]
Show[Plot[{f[x], 1}, {x, 541, 600}, PlotRangePadding -> 1, Frame -> True,
      Axes ->   False, 
      Epilog -> Inset[Framed[Style[x /. r, Medium, Bold, Red], 
                      Background -> LightYellow], 
                {x, 0} /. r]], 
     Graphics[Line[{{x, -1}, {x, 1}}] /. r]]

enter image description here

5 голосов
/ 16 октября 2011

Вот решение, основанное на пересечениях линий с линейной интерполяцией. Он найдет все переходы.

crossing[y_][ln : {{x1_, y1_}, {x2_, y2_}}] := 
 Quiet[(x1 y - x2 y - Det@ln)/(y1 - y2)] // 
  If[Sort[{x1, #, x2}][[2]] == #, #, Sequence @@ {}] &

crossing[1] /@ Partition[daList, 2, 1]
{573.648}

Несколько пересечений:

points = Table[{x, Sin[x]}, {x, 0, 10, 0.2}];

ListLinePlot[{points, {{0, 0.2}, {10, 0.2}}}]

enter image description here

crossing[0.2] /@ Partition[points, 2, 1]
{0.201395, 2.93926, 6.48559, 9.22311}
5 голосов
/ 15 октября 2011

Вы можете использовать Interpolation и перевернуть координаты x и y, чтобы получить InterpolatingFunction, который принимает y аргументы. Предполагая, что вы хотите линейную интерполяцию, вот как:

f = Interpolation[daList ~Reverse~ 2, InterpolationOrder -> 1];
f[1]

Out[1]=573.648
4 голосов
/ 17 октября 2011

Если вы хотите получить быстрый и грубый ответ без программирования, вы также можете выбрать график и нажать клавишу точки (.). Вы получите курсор-перекрестие и всплывающую подсказку с координатами перекрестия, например:

enter image description here
(перекрестье не слипается). Обратите внимание, что это равно результат мистера Уизардса, который немного отличается от результата Велисария. Это потому, что Велизарий использует Interpolation с настройкой по умолчанию InterpolationOrder (3). Если вы используете InterpolationOrder -> 1 все ответы согласны.

...