Пересечение или решение

#wolfram-mathematica #intersection #solution

#wolfram-mathematica #пересечение #решение

Вопрос:

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

 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 для красных частей, чтобы проиллюстрировать вопрос :

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

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

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

Ответ №1:

 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]
  

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

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

С легендой:

 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]]
  

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

Ответ №2:

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

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

Out[1]=573.648
  

Комментарии:

1. Этот вопрос сидел в течение 15 минут, затем БАМ, вы оба превзошли меня по времени, которое потребовалось для ввода.

2. Что ж, поскольку первый ответ был опубликован задолго до других, на этот раз нам не понадобится дуэль : D

3. Нет дуэли, вы явно быстрее. Но я предпочитаю использовать Reverse . Если я могу отредактировать ваш ответ с этим изменением, я удалю свой.

4. Для @Mr.Wizard amp; yoda это работает daList = Table[{x, x^3 5 x^2}, {x, -6, 3, .1}]; ?

5. @belisarius он сказал «значение», а не «значения» — это кажется разумным предположением.

Ответ №3:

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

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

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}}}]
  

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

 crossing[0.2] /@ Partition[points, 2, 1]
  
{0.201395, 2.93926, 6.48559, 9.22311}

Ответ №4:

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

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