2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 15:46 
ИСН в сообщении #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 
Аватара пользователя
Код:
y=spline(x, ...)

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

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:00 
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 
Аватара пользователя
Я не говорю, что именно это неправильно. Я говорю, что неправильно что-то в общей картине (это явствует из того, что функция возвращает бред), а разобраться в этом я не могу, потому что наверчено слишком много мишуры. Уберите всё, ВСЁ лишнее. Сделайте простую функцию. Одно число in, одно число out. Как синус, экспонента, иксквадрат и другие детские игрушки. Тупо обычную функцию.

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

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

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:04 
Аватара пользователя
Как пользоваться тем, что Вы написали, как для заданного x найти значение функции?
Для работы функции ей достаточно знать узлы $x_i$, и значения в узлах $y_i$. Это одномерные массивы, где они у Вас?

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:05 
Аватара пользователя
TOTAL в сообщении #639170 писал(а):
Как пользоваться тем, что Вы написали, как для заданного x найти значение функции?
Вот и я это спрашиваю. (Здесь под функцией понимается сплайн, конечно.) Вот сделайте, да, чтобы это было можно.
TOTAL в сообщении #639170 писал(а):
Это одномерные массивы, где они у Вас?

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

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:24 
Код:
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 
Аватара пользователя
В Вашем коде два слова Table и одно For. Читать нельзя.

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:27 
ИСН в сообщении #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 
Аватара пользователя
Ещё раз. Вы строите подсетку (более мелкую, чем сеть опорных значений сплайна), чтобы пройтись по ней и найти максимальную разность. Это всё понятно и правильно, но это потом. Пока что этого не надо. Не надо совсем. Нельзя строить подсетку. Не надо вычислять значение сплайна в десяти точках. Не надо даже в двух.
Надо в одной.

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

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

 
 
 
 Re: Построение интерполяционного сплайна степени 1
Сообщение02.11.2012, 16:53 
ИСН в сообщении #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 
ладно, предыдущие флуктуации , можно не рассматривать. Пока получилось реализовать что Вы рекомендовали. Просто сплайн. Просто в одной точке.
Код:
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 
Аватара пользователя
Вот в этом ещё плачевном, но уже работающем коде:
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 
ИСН в сообщении #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