#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
все ответы, согласны.