Провести поверхность через точки

anton-burduev


Надо построить гладкую функцию в круге (на рисунке жирная внешняя окружность имеющую в точках (мелкие черные кружки) заданные значения.
Any ideas?

komBAR

Надо построить гладкую функцию в круге (на рисунке жирная внешняя окружность имеющую в точках (мелкие черные кружки) заданные значения.
Any ideas?
А еще какие-нибудь требования есть? Если нет, все тупо - берешь произвольную функцию A_y(x такую что в точке y она равна 1, вне эпсилон-окрестности y равна 0. Дальше складываешь 13 таких функций (где y - это твои точки) c коэффициентами, равными значениям в точках.
Но полученная штука будет достаточно уныла, разумеется, в смысле ни о какой разумной интерполяции речи не будет.

anton-burduev

Да, нужна, конечно, более-менее адекватная интерполяция. Критерий адекватности строго сформулировать не могу, результат требуется для построения "красивой картинки".

Niklz

http://en.wikipedia.org/wiki/Kernel_smoother
можно взять гауссовское ядро, тогда твоя аппроксимирующаю функция с точностью до нормировки f(x) = \sqrt{2\pi\sigma}^{-2} \sum_i exp(-||x_i - x||^2 / \sigma^2)

anton-burduev

А она точно будет иметь заданные значения в точках? Мне кажется, что нет, или я чего-то не понял.

Niklz

не, она даст гладкое приближение. не заметил, если тебе нужно точно - не пойдет.

Elena12345

Для получения красивой картинки не обязательно строить функцию, можно мысленно натянуть поверхность, записать диффуры, которые её описывают, а потом численно посчитать их на достаточно мелкой сетке, задав значения в твоих точках.
PS: наверняка есть стандартные варианты диффуров для получения "адекватных, гладких" поверхностей

marina1206

Да это можно хоть в той же Mathematica сделать запросто.

var24

Если надо только картинку - это делает любой мало-мальски хороший программный пакет, где есть функция построения графиков.
Математику уже советовали, еще, например, гнуплот, ориджин, тот же эксель.

sashok01

есть программа surfer. Она умеет строить графики двумерных поверхностей, делая различные интерполяции входных данных. Попробуй использовать ее и выбери такую интерполяцию, которая тебе понравится "на глаз". Например, там есть метод "минимум кривизны", может он тебе подойдет.

anton-burduev

Если надо только картинку - это делает любой мало-мальски хороший программный пакет, где есть функция построения графиков. Математику уже советовали, еще, например, гнуплот, ориджин, тот же эксель.
Надо реализовать такую функциональность в программе, которую я разрабатываю.
Кстати ориджин с этой задачей не справляется: он триангулирует область и делает линейную интерполяцию внутри треугольников. В результате поверхность получается не гладкой, вот как-то так:

Я знаю, что в гнуплоте можно строить поверхности и карты высот (pm3d map но перед этим нужно как-то интерполировать функцию в достаточно большом числе точек. Или он сам как-то умеет?
В общем, если кто-то знает, как решить исходную задачу в каком-нибудь мат. пакете — дайте плиз ссылку на соответствующий хелп.

sashok01

пример расчета в surfer 8:
 
входные данные:
x y z
1 0 0
0.283662185 -0.958924275 0
-0.839071529 -0.544021111 0
-0.759687913 0.65028784 0
0.408082062 0.912945251 0
0.991202812 -0.13235175 0
0.15425145 -0.988031624 0
-0.903692205 -0.428182669 0
-0.666938062 0.74511316 0
0.525321989 0.850903525 0
0.964966028 -0.262374854 0
0.022126756 -0.999755173 0
-0.95241298 -0.304810621 0
-0.562453851 0.826828679 0
0.633319203 0.773890682 0
0.92175127 -0.387781635 0
-0.110387244 -0.993888654 0
-0.984376643 -0.17607562 0
-0.448073616 0.893996664 0
0.730173561 0.683261715 0
0.862318872 -0.506365641 0
-0.240959049 -0.970535284 0
-0.999020813 -0.044242678 0
-0.325809805 0.945435334 0
0.814180971 0.580611184 0
0.787714512 -0.616040459 0
-0.36729133 -0.93010595 0
-0.996087835 0.088368686 0
-0.197813574 0.980239659 0
0.883863374 0.467745162 0
0.699250806 -0.71487643 0
-0.48716135 -0.873311983 0
-0.975629313 0.219425258 0
-0.066336936 0.997797279 0
0.937994752 0.346649455 0
0.598484219 -0.801134595 0
-0.598460069 -0.801152636 0
-0.938005201 0.34662118 0
0.066306858 0.997799279 0
0.975622698 0.219454668 0
0.487187675 -0.873297297 0
-0.699229257 -0.714897508 0
-0.883877473 0.467718518 0
0.197784025 0.980245622 0
0.996085171 0.088398712 0
0.367319368 -0.930094878 0
-0.787695942 -0.616064204 0
-0.814198472 0.580586641 0
0.325781306 0.945445155 0
0.999022147 -0.044212563 0
0.240988305 -0.97052802 0
-0.862303608 -0.506391635 0
-0.730194157 0.683239704 0
0.448046667 0.89401017 0
0.984381951 -0.176045946 0
0.110417204 -0.993885326 0
-0.92173958 -0.387809421 0
-0.633342531 0.77387159 0
0.562428927 0.826845634 0
0.952422168 -0.304781911 0
-0.022096619 -0.99975584 0
-0.964958119 -0.262403942 0
-0.525347639 0.850887689 0
0.6669156 0.745133265 0
0.903705112 -0.428155428 0
-0.154221666 -0.988036273 0
-0.991198822 -0.132381629 0
-0.408109582 0.912932949 0
0.75966831 0.65031074 0
0.839087928 -0.543995817 0
-0.283633279 -0.958932825 0
-1 -3.01444E-05 0
-0.283691091 0.958915723 0
0 0 2
0.333333333 0 1
-0.149357872 0.297998888 1.2
-0.19948669 -0.267050879 1.3
0.328127317 -0.058681982 0.5
-0.094563697 0.319638574 3
0.666666667 0 3.1
0.350214659 0.567269016 2.3
-0.298715744 0.595997776 4.5
-0.664058557 0.058912457 0.5
-0.398973379 -0.534101757 3.4
0.244879578 -0.620063252 4.2
0.656254634 -0.117363964 1.2
0.4446104 0.49675551 3.2
-0.189127394 0.639277149 1.2

результаты:
_______________________________
Triangulation with linear interpolation:

Radial basis function:

Minimum curvature:

Kriging:

Romyk

Как насчет поверхности Безье?
википедия

sashok01

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

var24

Касательно гнуплота, там есть функция dgrid3d, которая занимается построением сеток и интерполяцией.
 
gnuplot> help dgrid3d
The `set dgrid3d` command enables, and can set parameters for, non-grid to
grid data mapping. See `splot grid_data` for more details about the grid data
structure.

Syntax:
set dgrid3d {<rows>} {,{<cols>}}
{ splines |
qnorm {<norm>} |
(gauss | cauchy | exp | box | hann) {<dx>} {,dy} }
unset dgrid3d
show dgrid3d

By default `dgrid3d` is disabled. When enabled, 3D data read from a file
are always treated as a scattered data set. A grid with dimensions derived
from a bounding box of the scattered data and size as specified by the
row/col_size parameters is created for plotting and contouring. The grid
is equally spaced in x (rows) and in y (columns); the z values are computed
as weighted averages or spline interpolations of the scattered points' z
values. In other words, a regularly spaced grid is created and the a smooth
approximation to the raw data is evaluated for all grid points. Only this
approximation is plotted, but not the raw data.

The number of columns defaults to the number of rows, which defaults to 10.

Several algorithms are available to calculate the approximation from the
raw data. Some of these algorithms can take additional parameters.
These interpolations are such the closer the data point is to a grid point,
the more effect it has on that grid point.

The `splines` algorithm calculates an interpolation based on "thin plate
splines". It does not take additional paramaters.

The `qnorm` algorithm calculates a weighted average of the input data at
each grid point. Each data point is
weighted inversely by its distance from the grid point raised to the norm
power. (Actually, the weights are given by the inverse of dx^norm + dy^norm,
where dx and dy are the components of the separation of the grid point from
each data point. For some norms that are powers of two, specifically 4, 8,
and 16, the computation is optimized by using the Euclidean distance in the
weight calculation, (dx^2+dy^2)^norm/2. However, any non-negative integer
can be used.) The power of the norm can be specified as a single optional
parameter. This algorithm is the default.

Finally, several smoothing kernels are available to calculate weighted
averages: z = Sum_i w(d_i) * z_i / Sum_i w(d_i where z_i is the value
of the i-th data point and d_i is the distance between the current grid
point and the location of the i-th data point. All kernels assign higher
weights to data points that are close to the current grid point and lower
weights to data points further away.

The following kernels are available:
gauss : w(d) = exp(-d*d)
cauchy : w(d) = 1/(1 + d*d)
exp : w(d) = exp(-d)
box : w(d) = 1 if d<1
= 0 otherwise
hann : w(d) = 0.5*(1-cos(2*pi*d if d<1
w(d) = 0 otherwise

When using one of these five smoothing kernels, up to two additional
parameter can be specified: dx and dy. These are used to rescale the
coordinate differences when calculating the distance:
d_i = sqrt( x-x_i)/dx)**2 + y-y_i)/dy)**2 where x,y are the
coordinates of the current grid point and x_i,y_i are the coordinates
of the i-th data point. The value of dy defaults to the value of dx,
which defaults to 1. The parameters dx and dy make it possible to
control the radius over which data points contribute to a grid point
IN THE UNITS OF THE DATA ITSELF.

A slightly different syntax is also supported for reasons of backwards
compatibility. If no interpolation algorithm has been explicitly selected,
the `qnorm` algorithm is assumed. Up to three comma-separated, optional
paramaters can be specified, which are interpreted as the the number of
rows, the number of columns, and the norm value, respectively.

The `dgrid3d` option is a simple scheme which replaces scattered data
with weighted averages on a regular grid.More sophisticated approaches
to this problem exist and should be used to preprocess the data outside
`gnuplot` if this simple solution is found inadequate.

See also
dgrid3d.dem: dgrid3d demo.
and
scatter.dem: dgrid3d demo.



Например, для интерполяции сплайнами надо написать что-нибудь типа
set dgrid3d <x>,<y> splines
где x,y - размеры сетки
В ориджине тоже можно экстраполировать, кстати
Analysis -> Mathematics -> 2D interpolate/extrapolate
Оставить комментарий
Имя или ник:
Комментарий: