2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 15:46 


27/10/11
228
ИСН в сообщении #639163 писал(а):
Вашу функцию я забраковал потому, что во-первых, она возвращает бред, а во-вторых, у неё внутри этот чёртов цикл, где Вы находите результат деления - подбором. Если не это копание ломом, то что?

Но она же просто поэлементно работает с векторами, ну почему же это не правильно ?
Берёт первый элемент из таблиц, работает с ними, записывает результат, после чего второй и так далее ... Ну почему же это не правильно ?
Ну а как же тогда мне работать с векторами ?
у меня есть сетка, хначения которой лежат в X[n]
ну как же если не тем циклом, мне залесть в этот массив, сначала в перый его элемент, затем во второй и так далее ?
Как записать функцию сплайна, ведь в ней же основа это вычитание $x_{j+1}$ элемента! но это же j+1 тый элемент !
**************************************************
Ну а если уходить от цикла, то только так моэно ещё работать с элементами вектора, но и это не функционирует...
Код:
a = -10.;
b = 10.;
n = 10.;
f[x_] := Exp[x]
h = (b - a)/n;
X[n_] := Table[{a + h*k, f[a + h*k]}, {k, 0, n}];
X = X[n]
m = 10.;
ss := Table[{a + (h/m)*k, f[a + (h/m)*k]}, {k, 0, n*m}]
ss
sbl = X[[i,
     2]] (ss[[i, 1]] - X[[i*m + 1, 1]])/(X[[i*m, 1]] -
      X[[i*m + 1, 1]]) +
  X[[i*m + 1,
     2]] ((ss[[i*m, 1]] - X[[i*m, 1]])/(X[[i*m + 1, 1]] -
       X[[i*m, 1]])), {i, 0, n, h/m}

Мне не лень пробовать, просто уже все варианты реализации закончились...

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 15:57 
Заслуженный участник
Аватара пользователя


23/08/07
5420
Нов-ск
Код:
y=spline(x, ...)

Если описана функция spline, которая для любого x из отрезка, вычисляет значение кусочно линейной функции, то это значение можно занести в переменную y. Где у Вас такая функция spline?

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:00 


27/10/11
228
TOTAL в сообщении #639167 писал(а):
Код:
y=spline(x, ...)

Если описана функция spline, которая для любого x из отрезка, вычисляет значение кусочно линейной функции, то это значение можно занести в переменную y. Где у Вас такая функция spline?


Вот она
Код:
sg1[x0_] :=
Module[{y = x0, j, X = X[n]},
For[j = 1, j <= n + 1, j++,
If[(y < j h) && (y > (j - 1) h),
s =
f[X[[j, 2]]] (y - X[[j + 1, 1]])/(X[[j, 1]] - X[[j + 1, 1]]) +
f[X[[j + 1,
2]]] ((y - X[[j, 1]])/(X[[j + 1, 1]] - X[[j, 1]]))
];
];
];
sg1[4.4]
s

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:01 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Я не говорю, что именно это неправильно. Я говорю, что неправильно что-то в общей картине (это явствует из того, что функция возвращает бред), а разобраться в этом я не могу, потому что наверчено слишком много мишуры. Уберите всё, ВСЁ лишнее. Сделайте простую функцию. Одно число in, одно число out. Как синус, экспонента, иксквадрат и другие детские игрушки. Тупо обычную функцию.

-- Пт, 2012-11-02, 17:04 --

Во всём Вашем коде слово Table должно быть один раз - когда находите значения базовой функции в опорных точках. Два раза его быть не должно. А слова For быть не должно вообще ни разу.

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:04 
Заслуженный участник
Аватара пользователя


23/08/07
5420
Нов-ск
Как пользоваться тем, что Вы написали, как для заданного x найти значение функции?
Для работы функции ей достаточно знать узлы $x_i$, и значения в узлах $y_i$. Это одномерные массивы, где они у Вас?

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:05 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
TOTAL в сообщении #639170 писал(а):
Как пользоваться тем, что Вы написали, как для заданного x найти значение функции?
Вот и я это спрашиваю. (Здесь под функцией понимается сплайн, конечно.) Вот сделайте, да, чтобы это было можно.
TOTAL в сообщении #639170 писал(а):
Это одномерные массивы, где они у Вас?

Это у него X (двумерный массив размером много на два).

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:24 


27/10/11
228
Код:
a = -10.;
b = 10.;
n = 10.;
f[x_] := Exp[x]
h = (b - a)/n;
X[n_] := Table[{a + h*k, f[a + h*k]}, {k, 0, n}];
X = X[n]

после чего, в sg1 подставляется точка, в которой мы изем значение сплайна.
Код:
sg1[x0_] :=
Module[{y = x0, j, X = X[n]},
For[j = 1, j <= n + 1, j++,
If[(y < j h) && (y > (j - 1) h),
s =
f[X[[j, 2]]] (y - X[[j + 1, 1]])/(X[[j, 1]] - X[[j + 1, 1]]) +
f[X[[j + 1,
2]]] ((y - X[[j, 1]])/(X[[j + 1, 1]] - X[[j, 1]]))
];
];
];

попробуем посмотреть чему равен сплайн в точке x=4.4
Код:
sg1[4.4]
s

определяем вектор подседки
Код:
m = 10.;
sss := Table[{a + (h/m)*k}, {k, 0, n*m}]
sss


Теперь в функцию вносим уже не просто переменную x а векторную переменную х, которая подразумевает собой подсетку
Код:
sg1[sss]
s

и получается ответ
1.0857

.....

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:27 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
В Вашем коде два слова Table и одно For. Читать нельзя.

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:27 


27/10/11
228
ИСН в сообщении #639169 писал(а):
Я не говорю, что именно это неправильно. Я говорю, что неправильно что-то в общей картине (это явствует из того, что функция возвращает бред), а разобраться в этом я не могу, потому что наверчено слишком много мишуры. Уберите всё, ВСЁ лишнее. Сделайте простую функцию. Одно число in, одно число out. Как синус, экспонента, иксквадрат и другие детские игрушки. Тупо обычную функцию.

-- Пт, 2012-11-02, 17:04 --

Во всём Вашем коде слово Table должно быть один раз - когда находите значения базовой функции в опорных точках. Два раза его быть не должно. А слова For быть не должно вообще ни разу.


Простите я в корне запутался...

-- 02.11.2012, 17:28 --

ИСН в сообщении #639180 писал(а):
В Вашем коде два слова Table и одно For. Читать нельзя.


Ну ведь для построения подсетки Table тоже нужен...

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:37 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Ещё раз. Вы строите подсетку (более мелкую, чем сеть опорных значений сплайна), чтобы пройтись по ней и найти максимальную разность. Это всё понятно и правильно, но это потом. Пока что этого не надо. Не надо совсем. Нельзя строить подсетку. Не надо вычислять значение сплайна в десяти точках. Не надо даже в двух.
Надо в одной.

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:37 
Заслуженный участник
Аватара пользователя


23/08/07
5420
Нов-ск
X[n_] := Table[{a + h*k, f[a + h*k]}, {k, 0, n}];
После того, как описана функция, вычисляющая сплай, почему бы вот точно также не вычислить значение сплайна на другой (любой) сетке. Надо только заменить f на функцию сплайн.

Что-то у меня антивирус стал кричать про угрозу при заходе в эту (и другие) тему???

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:53 


27/10/11
228
ИСН в сообщении #639184 писал(а):
Ещё раз. Вы строите подсетку (более мелкую, чем сеть опорных значений сплайна), чтобы пройтись по ней и найти максимальную разность. Это всё понятно и правильно, но это потом. Пока что этого не надо. Не надо совсем. Нельзя строить подсетку. Не надо вычислять значение сплайна в десяти точках. Не надо даже в двух.
Надо в одной.


Вот , хочу построить в точкe x=1:
Если не менять интервалы сплайна, а просто строить функцию сплайна по интервалу [a,a+h]
то вот что удивительно, функция даже что-то возвращает

Код:
a=1.
b=2.
n=10.
s2[x_] :=
f[z[[a]]]*(x - z[[b]])/(z[[a]] - z[[b]]) +
  f[z[[b]]]*(x - z[[a]])/(z[[b]] - z[[a]])
s2[1.]

2.71828
Exp[1.]
2.71828


Но если попытаться сделать функцию, ужа зависимую от того, в какой интервал попадает это число...
Код:
a = -10.;
b = 10.;
n = 10.;
f[x_] := Exp[x]
h = (b - a)/n;
z := Table[a + h*k, {k, 0, n}];
z

Код:
s[x_] :=
  f[z[[a + h*k]]]*(x - z[[a + h*(k + 1)]])/(z[[a + h*k]] -
       z[[a + h*(k + 1)]]) +
   f[z[[a + h*(k + 1)]]]*(x - z[[a + h*k]])/(z[[a + h*(k + 1)]] -
       z[[a + h*k]])
s[4.]


То тогда она перестаёт функционировать)

Давабление Table проблему не решает...
Код:
s[x_] := Table[
  f[z[[a + h*k]]]*(x - z[[a + h*(k + 1)]])/(z[[a + h*k]] -
       z[[a + h*(k + 1)]]) +
   f[z[[a + h*(k + 1)]]]*(x - z[[a + h*k]])/(z[[a + h*(k + 1)]] -
       z[[a + h*k]]), {k, 0, n}]



И получается на выходе вот такой вот мусор
Код:
Part::partw: Part 12.` of {-10.,-8.,-6.,-4.,-2.,0.,2.,4.,6.,8.,10.} does not exist. >>
0.054276, 1.98168, 54.5982, 54.5982, (2980.96 (4. - List))/(
8. - List) - (4. E^List)/(-8. + List), (
0.000335463 (4. - List))/(-8. - List) + (12. E^List)/(
8. + List), 0.0542
   



Но ведь всё равно , при построении этого сплайна надо учитывать в какой подинтервал эта точка попадает....
Т.е. всё равно надо придумать как менять границы сплайна, в зависимости от вводимого в функцию числа. Но как это сделать , сохранив простоту ? Да хоть просто, как это сделать...

-- 02.11.2012, 17:54 --

TOTAL в сообщении #639186 писал(а):
X[n_] := Table[{a + h*k, f[a + h*k]}, {k, 0, n}];
После того, как описана функция, вычисляющая сплай, почему бы вот точно также не вычислить значение сплайна на другой (любой) сетке. Надо только заменить f на функцию сплайн.

Что-то у меня антивирус стал кричать про угрозу при заходе в эту (и другие) тему???


Спасибо, отличная идея (всё гениальное - просто :-))Теперь осталось домучить функцию сплайна


п.п.с. извинте, за некоторый бардак в комментарии, изменяел его несколько раз после написания ))

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 18:12 


27/10/11
228
ладно, предыдущие флуктуации , можно не рассматривать. Пока получилось реализовать что Вы рекомендовали. Просто сплайн. Просто в одной точке.
Код:
a = 1.;
b = 2.;
n = 10.;
m = 15;
f[x_] := Exp[x]
h = (b - a)/n;
z := Table[a + h*k, {k, 0, n}];
z



Код:
s2[x_] :=
f[z[[1]]]*(x - z[[n + 1]])/(z[[1]] - z[[n + 1]]) +
  f[z[[n + 1]]]*(x - z[[1]])/(z[[n + 1]] - z[[1]])
s2[1]

Которыый невероятно, но факт, приближает функцию экспоненты в точке 1
2.71828
Exp[1.]
2.71828

..... А теперь я , как говорит одна "звезда" в шокее...

Код:
szb := Table[{a + (h/m)*k, s2[a + (h/m)*k]}, {k, 0, n}];
szb

...
Код:
{{1., 2.71828}, {1.00667, 2.74942}, {1.01333, 2.78056}, {1.02,
  2.8117}, {1.02667, 2.84284}, {1.03333, 2.87397}, {1.04,
  2.90511}, {1.04667, 2.93625}, {1.05333, 2.96739}, {1.06,
  2.99853}, {1.06667, 3.02967}}

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

-- 02.11.2012, 20:06 --

Код:
b = 1.;
n = 10.;
m = 15;
f[x_] := Exp[x]
h = (b - a)/n;
z := Table[a + h*k, {k, 0, n}];
z

s2[x_] :=
f[z[[1]]]*(x - z[[n + 1]])/(z[[1]] - z[[n + 1]]) +
f[z[[n + 1]]]*(x - z[[1]])/(z[[n + 1]] - z[[1]])
s2[1]
szb := Table[{a + (h/m)*k, s2[a + (h/m)*k]}, {k, 0, n*m}];
szb
ListPlot[szb]
Plot[Exp[y], {y, -1, 1}]

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 19:10 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Вот в этом ещё плачевном, но уже работающем коде:
Alexeybk5 в сообщении #639208 писал(а):
Код:
s2[x_] :=
f[z[[1]]]*(x - z[[n + 1]])/(z[[1]] - z[[n + 1]]) +
  f[z[[n + 1]]]*(x - z[[1]])/(z[[n + 1]] - z[[1]])
Вы используете значение опорной функции в каких точках?

 Профиль  
                  
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 19:12 


27/10/11
228
ИСН в сообщении #639230 писал(а):
Вот в этом ещё плачевном, но уже работающем коде:
Alexeybk5 в сообщении #639208 писал(а):
Код:
s2[x_] :=
f[z[[1]]]*(x - z[[n + 1]])/(z[[1]] - z[[n + 1]]) +
  f[z[[n + 1]]]*(x - z[[1]])/(z[[n + 1]] - z[[1]])
Вы используете значение опорной функции в каких точках?

Пока что в перой и последней, никак не соображу как изменить это на точки сетки X[n]...

пока есть что-то похожее на
Код:
For[j = 1, j <= n, j++,
If[(x <= z[[j + 1]]) && (x >= z[[j]]),
  s3[x_] :=
   f[z[[j]]]*(x - z[[j + 1]])/(z[[j]] - z[[j + 1]]) +
    f[z[[j + 1]]]*(x - z[[j]])/(z[[j + 1]] - z[[j]])]]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 81 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group