Получить X от Y с MATLAB Spline - PullRequest
1 голос
/ 04 ноября 2011

У меня есть два вектора в MATLAB, X и Y.
Y является функцией X, но X не является функцией Y.

Я хотел бы получить значение X из сплайна (X, Y) для данного значения Y.

Как я могу это сделать? Я попытался использовать pp из сплайна, но я не очень далеко продвинулся в этом.

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Вы сами говорите, что x не является функцией y.Это означает, что есть несколько решений проблемы, по крайней мере, для НЕКОТОРЫХ значений y.

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

Используйте схему брекетинга для определения интервала, в котором существует корень.Если сплайн не является монотонным в течение заданного интервала, вам, возможно, потребуется усложнить здесь, но нетрудно найти место, где кубический полином достигает своего максимального / минимального значения, так как для этого требуется не более, чем найти корниквадратный полином.

Если у вас есть интервал для решения:

  1. Вы можете использовать fzero, находя решение для (f (x) -y).Хотя fzero не нуждается в скобках, чтобы работать большую часть времени, он может не найти решения в плохих случаях.И если вы предоставите скобку, то fzero найдет решение, которое вы выберете, если существует несколько решений.(В этом случае я установил правило, продиктованное клиентом, которое я выбрал бы всегда самое правое или самое левое решение.)

  2. Вы можете использовать корни на выбранном стр.сегмент.Это будет, конечно, быстрее, чем при использовании fzero, и значительно точнее.Конечно, корни будут возвращать несколько решений, поэтому вам нужно выбрать правильный корень.Некоторые из этих решений могут быть комплексными числами для исключения.

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

Последнее решение самое быстрое, ЕСЛИ вы тщательно пишете код.Фактически, это может быть векторизовано, чтобы решить для всех точек сразу.(Сделав это, я буду утверждать, что это можно сделать. Хорошо, на самом деле, это было задание по программированию для студента кооператива, который работал на меня в то время.)

Я думаю, почему выне удалось правильно использовать форму pp, если вы не поняли, как работает форма pp.Это, конечно, важно для правильного использования этих инструментов.

Попробуйте построить один пп-сегмент сплайна.Используйте ppval для оценки.Кажется, сначала он не работает должным образом?Это означает, что вы неправильно понимаете, что эти сегменты смещены влево, так что левая конечная точка ЛЮБОГО интервала всегда принимается равной нулю.Это делает отрезок кубического полинома более точным в зависимости от точек разрыва сплайна.Например, сплайн, имеющий разрывы [0 1 2 3], и сплайн, имеющий разрывы в [1000001 1000001 1000002 1000003], должны работать одинаково, ЕСЛИ значения функций идентичны.Видите, это будет численная проблема в арифметике с плавающей запятой, когда вы кубируете слишком большие числа.

Опять же, я даже утверждаю, что все это может быть тщательно векторизовано, хотя это потребовало некоторых умственных усилий, когда мыЭто.Самое простое решение - использовать fzero, как я его описал.

0 голосов
/ 04 ноября 2011

Вы можете использовать lsqnonlin.

Сделайте забавный аргумент функцией, которая вычисляет сплайн, и вычтите желаемое значение Y, чтобы при достижении желаемого значения Y результат был равен нулю.

...