2013-11-22 2 views
0

Мне нужна помощь с Interp1 (линейный метод от Matlab). Проблема заключается в следующем:Проблемы с диапазоном при вычислении линейной интерполяции в matlab

У меня есть вектор с значениями функций, называемыми fx.

fx = 1.0e+03 * 

2.0500 
-0.0005 
-0.0005 
-0.0004 
-0.0003 
-0.0004 
-0.0005 
-0.0005 
-0.0006 
-0.0007 
-0.0008 
-0.0008 
-0.0009 
-0.0010 
-0.0011 
-0.0011 
-0.0012 
-0.0013 
-0.0013 
-0.0014 
-0.0015 
-0.0015 
-0.0016 
-0.0016 
-0.0017 
-0.0018 
-0.0018 
-0.0019 
-0.0019 
-0.0020 
-0.0020 
-0.0021 
-0.0022 
-0.0022 
-0.0023 
-0.0023 
-0.0024 
-0.0024 
-0.0025 
-0.0025 
-0.0026 
-0.0027 
-0.0027 
-0.0028 
-0.0028 
-0.0029 
-0.0029 
-0.0030 
-0.0030 
-0.0031 
-0.0031 
-0.0032 
-0.0032 
-0.0033 
-0.0033 
-0.0034 
-0.0034 
-0.0035 
-0.0035 
-0.0036 
-0.0036 
-0.0037 
-0.0037 
-0.0038 
-0.0038 
-0.0038 
-0.0039 
-0.0039 
-0.0040 
-0.0040 
-0.0041 
-0.0041 
-0.0042 
-0.0042 
-0.0043 
-0.0043 
-0.0043 
-0.0044 
-0.0044 
-0.0045 
-0.0045 
-0.0046 
-0.0046 
-0.0046 
-0.0047 
-0.0047 
-0.0048 
-0.0048 
-0.0048 
-0.0049 
-0.0049 
-0.0050 
-0.0050 
-0.0050 
-0.0051 
-0.0051 
-0.0051 
-0.0052 
-0.0052 
-0.0053 
-0.0053 
-0.0053 
-0.0054 
-0.0054 
-0.0054 
-0.0055 
-0.0055 
-0.0055 
-0.0056 
-0.0056 
-0.0056 
-0.0057 
-0.0057 
-0.0057 
-0.0057 
-0.0058 
-0.0058 
-0.0058 
-0.0059 
-0.0059 
-0.0059 
-0.0059 
-0.0060 
-0.0060 
-0.0060 
-0.0060 
-0.0061 
-0.0061 
-0.0061 
-0.0061 
-0.0062 
-0.0062 
-0.0062 
-0.0062 
-0.0062 
-0.0063 
-0.0063 
-0.0063 
-0.0063 
-0.0063 
-0.0063 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0065 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0064 
-0.0063 
-0.0063 
-0.0063 
-0.0063 
-0.0062 
-0.0062 
-0.0062 
-0.0062 
-0.0061 
-0.0061 
-0.0061 
-0.0061 
-0.0060 
-0.0060 
-0.0060 
-0.0059 
-0.0059 
-0.0059 
-0.0058 
-0.0058 
-0.0058 
-0.0057 
-0.0057 
-0.0056 
-0.0056 
-0.0055 
-0.0055 
-0.0054 
-0.0054 
-0.0053 
-0.0053 
-0.0052 
-0.0052 
-0.0051 
-0.0051 
-0.0050 
-0.0050 
-0.0049 
-0.0048 
-0.0048 
-0.0047 
-0.0047 
-0.0046 
-0.0045 
-0.0045 
-0.0044 
-0.0043 
-0.0042 
-0.0042 
-0.0041 
-0.0040 
-0.0039 
-0.0038 
-0.0038 
-0.0037 
-0.0036 
-0.0035 
-0.0034 
-0.0033 
-0.0032 
-0.0031 
-0.0030 
-0.0030 
-0.0029 
-0.0028 
-0.0027 
-0.0025 
-0.0024 
-0.0023 
-0.0022 
-0.0021 
-0.0020 
-0.0019 
-0.0018 
-0.0017 
-0.0015 
-0.0014 
-0.0013 
-0.0012 
-0.0010 
-0.0009 
-0.0008 
-0.0006 
-0.0005 
-0.0004 
-0.0002 
-0.0001 
0.0000 
0.0002 
0.0003 
0.0005 
0.0006 
0.0008 
0.0009 
0.0011 
0.0013 
0.0014 
0.0016 
0.0018 
0.0019 
0.0021 
0.0023 
0.0024 
0.0026 
0.0028 
0.0030 
0.0032 
0.0034 
0.0035 
0.0037 
0.0039 
0.0041 
0.0043 
0.0045 
0.0047 
0.0049 
0.0052 
0.0054 
0.0056 
0.0058 
0.0060 
0.0063 
0.0065 
0.0067 
0.0069 
0.0072 
0.0074 
0.0077 
0.0079 
0.0081 
0.0084 
0.0086 
0.0089 
0.0092 
0.0094 
0.0097 
0.0100 
0.0102 
0.0105 
0.0108 
0.0111 
0.0113 
0.0116 
0.0119 
0.0122 
0.0125 
0.0128 
0.0131 
0.0134 
0.0137 
0.0140 
0.0144 
0.0147 
0.0150 
0.0153 
0.0157 
0.0160 
0.0163 
0.0167 
0.0170 
0.0174 
0.0177 
0.0181 
0.0185 
0.0188 
0.0192 
0.0196 
0.0199 
0.0203 
0.0207 
0.0211 
0.0215 
0.0219 
0.0223 
0.0227 
0.0231 
0.0235 
0.0239 
0.0244 
0.0248 
0.0252 
0.0257 
0.0261 
0.0266 
0.0270 
0.0275 
0.0279 
0.0284 
0.0289 
0.0293 
0.0298 
0.0303 
0.0308 
0.0313 
0.0318 
0.0323 
0.0328 
0.0333 
0.0338 
0.0343 
0.0349 
0.0354 
0.0359 
0.0365 
0.0370 
0.0376 
0.0381 
0.0387 
0.0393 
0.0398 
0.0404 
0.0410 
0.0416 
0.0422 
0.0428 
0.0434 
0.0440 
0.0447 
0.0453 
0.0459 
0.0466 
0.0472 
0.0479 
0.0485 
0.0492 
0.0499 
0.0505 
0.0512 
0.0519 
0.0526 
0.0533 
0.0540 
0.0547 
0.0554 
0.0562 
0.0569 
0.0576 
0.0584 
0.0591 
0.0599 
0.0607 
0.0615 
0.0622 
0.0630 
0.0638 
0.0646 
0.0654 
0.0663 
0.0671 
0.0679 
0.0688 
0.0696 
0.0705 
0.0713 
0.0722 
0.0731 
0.0740 
0.0749 
0.0758 
0.0767 
0.0776 
0.0785 
0.0794 
0.0804 
0.0813 

У меня есть значение для оси х

x = [0.00111:0.0111:5]; 

я получил некоторую помощь, прежде чем с вычислением интерполяции следующим образом:

f = @(xq)interp1(x, fx, xq); 
[~, x_t] = ode45(@(t,x)f(x), [0 1], 2); 

откуда значение хда берется?

Я получаю некоторые значения NaN после решения этого ОДУ. Я не понимаю, почему. Я считаю, что мои значения fx и значения x верны или могут быть не такими? Значения fx исправлены, поэтому я меняю значения x много раз, но без какого-либо взгляда.

Почему я получаю значения NaN и как я могу это исправить? Что это за пределами диапазона?

Я знаю, что это не самый интересный и сложный вопрос для многих из вас, но я бы очень признателен за помощь! :)

Заранее спасибо!

моих результатов после ode45 к интерполированной функции F:

x_t = 
2.0000 
1.8696 
1.7382 
1.6081 
1.4810 
1.3584 
1.2412 
1.1304 
1.0262 
0.9290 
0.8388 
0.7555 
0.6788 
0.6084 
0.5440 
0.4853 
0.4319 
0.3834 
0.3395 
0.2999 
0.2643 
0.2323 
0.2038 
0.1784 
0.1559 
0.1360 
0.1186 
0.1035 
0.0903 
0.0788 
0.0688 
0.0601 
0.0523 
0.0452 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 
    NaN 

ответ

1

Таким образом, вы не должны иметь свою интерполяцию в качестве функциональной ручки. xq - это значение x, при котором вы хотите интерполировать значение f. Так, например, если у вас есть это:

x = [1 2 3]; 
fx = [0 4 8]; 

затем с помощью линейной интерполяции, правильный f для x==1.5 будет 2 (т.е. 1.5 полпути между 1 и 2 (х-значения), так что мы получаем 2, как это на полпути между 0 и 4 (значения fx))

Однако, я думаю, вы не используете ode45 правильно. Функция, которую вы передаете, должна быть дифференциальным уравнением, а не просто интерполяцией. Но куча наблюдений - это не D.E., если что-то это решение для D.E. Поэтому я думаю, вам, возможно, потребуется переосмыслить вашу проблему и либо лучше понять себя о D.E. вы пытаетесь решить или опубликовать намного больше информации об этом.

+0

Hi @Dan Я прошу прощения за недостаток информации, приведенной в моей проблеме !. Я постараюсь лучше объяснить свою проблему. My fx - действительно ODE. Обычно мы пишем x_dot = f (x), но в моем случае у меня нет функции f (x). У меня просто есть значения функции (это fx). У меня есть тестовая функция для x_dot (которая дается явно) и тестовое решение. Я нашел метамодель (приближение RHS x_dot). Эта метамодель - это моя fx, которая является ODE и дискретной функцией x, которую я хочу решить. Надеюсь, это прояснит ваши вопросы. Я бы с удовольствием предоставил больше информации. –

+0

Еще один раз: D У меня нет кучки точек, у меня есть значения функций, заданные как вектор-столбец. –

+0

@SergioSarmiento Можете ли вы (теоретически) решить это вручную? Я бы так не подумал ... Я уверен, что вам нужно 'f' в функциональной форме перейти к ode45 ... просто взгляните на примеры в документах. – Dan

1

Я могу ответить на ваш первый вопрос. Это взято из документации MATLAB:

VQ = interp1 (х, у, XQ) возвращает интерполированные значения функции 1-D в определенных точках запроса с использованием линейной интерполяции. Вектор x содержит точки выборки, а v содержит соответствующие значения v (x). Вектор xq содержит координаты точек запроса.

«q» в «xq» означает «запрос».Вы указываете MATLAB все функции (x, f(x)), а затем попросите его рассказать вам, какая функция будет по адресу x = xq.

Итак, ваша функция ручки f говорит: «Вы даете мне xq, и я дам вам f (xq), насколько я могу использовать интерполяцию». Он обертывает interp1 так, что ему нужен только 1 аргумент, а не 3.

Что касается второго вопроса (NaN), можете ли вы сделать следующее и сообщить нам, что такое T?

[T, x_t] = ode45(@(t,x)f(x), [1,2], 2); 
+0

Hi @rangu Спасибо за ваш ответ. Я добавил значения T, которые вы просили. Любая подсказка, почему появляется NaN? –

+0

К сожалению; думаю, нам не нужно T. Мое лучшее предположение заключалось бы в том, что, поскольку 'f' определяется только для диапазона' x = [0.00111, 5] ', ode45 может интегрироваться за этот диапазон. Извините, я не могу помочь дальше в данный момент. – rangu

0

У меня есть ответ на мою проблему. Функция fx (я говорю функция даже думала, что есть вектор, это потому, что у меня есть значения функции) является лишь приближением к моей правой части ОДУ, это происходит следующим образом:

x_dot = f(x) 

где f может быть векторной или скалярной функцией и может быть линейным или нелинейным ODE.

fx is ~= f(x) %an approximation to the originally function. 

Этот FX называется метамодель f(x). Это означает, что fx является упрощенной моделью реальной модели. По этой причине, когда я интерполировать fx и решить ОДУ:

[~, x_t] = ode45(@(t,x)f(x), [0 1], 2); 

В зависимости от исходного значения, некоторые из значений будут лежать внутри области решения о метамодели, и в этом случае, я буду получать реальную стоимость для x_t. Если некоторые значения перемещаются за пределы, где определена метамодель, я получаю NaN. Что происходит выше. Тем не менее, эти значения находятся за пределами области метамодели, но не вне области реальной модели, а это значит, что решения существуют, но вне моего диапазона! Огромное спасибо за ответы, которые я получил раньше!

Смежные вопросы