|
|
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
Я изложу вопрос и как я его решил. Хотелось бы узнать ваши комментарии. Что можно исправить, дополнить и есть ли вообще подход проще и компактнее. Пишу свою функцию интерполяции. На вход поступает две последовательсности - значений аргумента функции и значений функции. Также на вход подаётся заданное значение аргумента, не совпадающее ни с одним из значений последовательности аргументов, но лежащее в пределах этой последовательности. Нужно найти интерполированное значение функции, соответствующее заданному аргументу. Линейная интерполяция. Я сделал так - просто перебираю входящую последовательность аргументов функции, пока не найду значение аргумента (это будет "текущее значение аргумента"), бОльшее заданного аргумента. После этого беру текущее значение аргумента и предыдущее - заданное будет лежать между ними - и, соответственно, текущее и предыдущее значения функции, и интерполирую линейно по уравнению прямой по двум точкам . Всё просто, но вопрос в условии цикла перебора аргументов - авторпока не найду значение аргумента , бОльшее заданного аргумента Это будет работать, только если входящая последовательность аргументов возрастает. А если она убывает? Тогда что делать? Хотелось бы написать максимально компактную функцию, не растекаясь кодом по логике. Я придумал такой вариант решения - принудительно упорядочивать последовательность аргументов по возрастанию. Известно, что входящая последовательность аргументов может либо монотонно возрастать, либо монотонно убывать. Также известно, что входящая последовательность значений функции соответствует входящей последовательности аргументов функции. Поэтому я могу вообще ограничиться простым реверсом входящих аргументов, если любые два из них не удовлетворяют условию, что аргумент с бОльшим индексом больше аргумента с меньшим индексом. Соотетственно, надо сделать реверс и последовательности значений функции. Вот код Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 11:38 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
Можно ещё добавить в начало функции проверку на монотонность входящей последовательности элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 11:55 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
Т. е. входящей последовательности аргументов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 11:55 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
Достаточно просто сравнивать очередное входящее с текущими максимальным меньшим и минимальным бОльшим аргументами, чем в точке интерполяции - после перебора входной последовательности текущие будут ближайшими. Если входящая последовательность гарантированно сортирована по аргументу - достаточно сканировать её до изменения знака разности текущей сканируемой точки и точки интерполяции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 15:33 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
AkinaЕсли входящая последовательность гарантированно сортирована по аргументу - достаточно сканировать её до изменения знака разности текущей сканируемой точки и точки интерполяции. Да, гарантированно отсортирована по аргументу. Только неизвестно, по возрастанию аргумента или по убыванию - может быть любой порядок. Также может быть, что значение аргумента текущей точки совпадёт со значением аргумента точки интерполяции - для этого надо отдельное условие (у меня оно есть). Ещё у вас на каждой итерации две операции - нахождение разности и проверка её знака (я так понимаю, это логическая операция). А у меня только одна логическая. И не могли бы вы привести ваш алгоритм, я в первой части не понял, что вы имеете ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 22:08 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
user7320гарантированно отсортирована по аргументу. Только неизвестно, по возрастанию аргумента или по убыванию - может быть любой порядок. Также может быть, что значение аргумента текущей точки совпадёт со значением аргумента точки интерполяции - для этого надо отдельное условие (у меня оно есть). if sign(approx-prev)<>sign(approx-next) Причёв одно вычитание - реальное, а другое - выполнено на предыдущей итерации. [quot user7320]AkinaА у меня только одна логическая. Ага, щазз! одна! а реверс, конечно, выполнится за один процессорный такт... И поменяй местами If-ы... а то у тебя две логические, а не одна... и, может, даже преобразуй второй if в elseif... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2012, 22:41 |
|
||
|
Оцените подход к линейной интерполяции значения функции
|
|||
|---|---|---|---|
|
#18+
Вы уже начали противоречить user7320Также может быть, что значение аргумента текущей точки совпадёт со значением аргумента точки интерполяцииuser7320на вход подаётся заданное значение аргумента, не совпадающее ни с одним из значений последовательности аргументовВпрочем, это не принципиально (интерполяция на конце отрезка вернёт значение функции на этом конце отрезка), мы только должны быть уверены, что точка интерполяции принадлежит всему интервалу аргументов (аргументов не менее двух). Реверсирование тоже не нужно - мы только должны быть уверены, что значения аргументов монотонно изменяются, кроме того, возможны варианты: например, это может быть очередь данных, и вы их никогда не сможете пресортировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2012, 10:36 |
|
||
|
|

start [/forum/topic.php?fid=16&tid=1342028]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
148ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 454ms |

| 0 / 0 |
