2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Интерполяция в MatLab
Сообщение04.12.2010, 21:39 


04/12/10
33
Доброго времени суток!
Прошу по возможности помочь.

Имеются два массива чисел Y и Х , собственно значения функции в точках Х. Необходимо найти значения функции в промежуточных точках, т.е. интерполировать.
Используя Mathcad, всё получается очень здорово
yy= cspline / pspline (x,y)
y(t)= interp(yy,x,y,t)
Я могу найти значения функции в любой! точке t [min(x),max(x)]

То же самое я хочу сделать теперь в MatLab'е
Т.к. я не совсем хорошо владею данный пакетом, возникли сложности.
Как я понял нужно использовать нечто вроде этого:
yy=interp1(x,y,xi); - вот первая проблема необходимо использовать заданные пользователем значения xi,
Соответственно у меня на выходе массив от 1 до № max(xi).
И хочу я получить значение yy в т. N.
yy(N)=... и я получаю элемент массива yy с номером N, а как мне получить само значение. Ладно еще если можно внести соответствие yy(N-первый элемент xi), тогда еще нормально. А промежуточные значения, скажем xi=1:10
а нужно yy(5.2), т.е значение ф-ции Y в точке 5,2 ( в Mathcad такое возможно)
Конкретный пример
Код:
K_sigma_add_y=[1 1 .99 .98 .97 .94 .85 .8 .7 .58 .5 .42 .42 .4 .39 .38 .375 .365 ...
     .37 .38 .385 .4 .44 .5 .54 .565 .6 .65 .66 .7 .7 .725 .73 .77 .8 .83 ...
     .84 .86 .865 .9 .917 .92 .925 .93 .935 .94 .95 .96 .97 .98 .98 .99 1 1];
K_sigma_add_x=[1e-4 5e-4 1e-3 2e-3 4e-3 6e-3 1e-2 2e-2 4e-2 6e-2 8e-2 1e-1 ...
     .15 2e-1 .3 4e-1 5e-1 6e-1 8e-1 9e-1 1 2 4 6 7 8 9 10 15 20 25 30 35 ...
     45 50 60 65 75 85 95 100 120 150 200 250 300 350 400 500 600 700 800 900 1000 ];

Нужно найти значение ф-ции К_сигма в любой точке, как видите х очень широко варьируется.
Пока я вижу только такой вариант
даже если сделать так xiKsigmaadd=1e-4:1e-4:1000; ну и проинтерполировать interp1, то на выходе будет массив с номерами от 1 до ... и как в таком случае получить значение функции в 0,058 например?

Хелп читал, Дьяконова (тот же хелп но на русском) тоже читал. Ничего соответствующего не нашел. Может плохо читал. Почему-то уверен что такой фокус можно проделать в Matlabe (раз уж можно в Маткаде).
Заранее спасибо.
надеюсь проблему описал как можно более полно.

-- Сб дек 04, 2010 21:55:27 --

Ну вот...
стоило написать на форум стало всё понятно

Ответ таков yy=interp1(x,y,координата искомого значения функции, метод)

Может кому-нибудь понадобиться, если модераторы решат удалить я нисколько не обижусь.

:-)

 Профиль  
                  
 
 Re: Интерполяция в MatLab
Сообщение05.12.2010, 00:11 
Заслуженный участник


11/05/08
32166
Acid Snow в сообщении #383598 писал(а):
Как я понял нужно использовать нечто вроде этого:

Надо использовать:
Код:
P=polyfit(X,Y,n)

(Возвращает массив коэффициентов многочлена. Последний параметр -- это степень многочлена. Если она согласована с размерностями первых двух массивов, т.е. на единичку меньше их длины, то возвращается именно интерполяционный многочлен, а если меньше -- то многочлен, получаемый по методу наименьших квадратов.)

А потом -- для вычисления значения многочлена в точке $t$ (ну или в массиве точек, разумеется) -- использовать
Код:
polyval(P,t)

 Профиль  
                  
 
 Re: Интерполяция в MatLab
Сообщение05.12.2010, 00:45 


04/12/10
33
ewert в сообщении #383651 писал(а):
Надо использовать:


если только данный многочлен вполне нормально описывает поведение кривой.
используя Tools в Figure b basic Fittings поствил галки на всех, от кубического до многочлена в 10
участок от 10 до 1000 ( в примере) описывают ну еще можно подобрать, а от 1е-4 до 0 ну никак вообще

спасибо за участие.

 Профиль  
                  
 
 Re: Интерполяция в MatLab
Сообщение05.12.2010, 03:06 


04/12/10
33
Возникла другая проблема.

Имеется система уравнений.
Код:
ne=ni
k*Te*ne+k*Tion*ni+k*Tion*na=Pressure
sqrt(na*12*((2*3.141*me*k*Te)/h^2 )^1.5*exp(-Eion/(k*Te)) )=ne

Нужно найти ne,ni,na
Остальные переменные определены.
На примере того же Маткада, это загоняется в блок Given Find и неизвестные находятся
Как это реализовать в Матлабе?
Есть вроде solve, но когда я пытаюсь применить его к этой системе, он символьно вычисляет мне какие-то абсолютно дикие выражения, при чем получается что у каждой неизвестной два значения, хотя должно быть одно.
Пытался применить fsolve, но вышло как-то неудачно.
Один из последних вариантов реализации функции

Код:
function conc = concentration(N,k,Te,Tion,Pressure,me,Eion,h)

ne=N(1);
na=N(2);

conc(1)=k*(ne*Te+ne*Tion+na*Tion)-Pressure;
conc(2)=sqrt(na*12*((2*3.141*me*k*Te)/h^2 )^1.5*exp(-Eion/(k*Te)) )-ne;

end

Несмотря на то что concentration(N,k,Te,Tion,Pressure,me,Eion,h), вроде бы определил выходящие значения.
Все равно ругается на
Цитата:
Undefined function or variable
.
Короче вот запарка.
Есть мысль делать это в цикле, но вот хотелось бы по компактней (хотя что будет компактней...).
Буду очень благодарен если расскажете как.

 Профиль  
                  
 
 Re: Интерполяция в MatLab
Сообщение06.12.2010, 20:42 


04/12/10
33
Может кто-нибудь подсказать.

Вот последнее что сделал

Код:
function conc = concentration(x)

format long eng

global Te k Tion Pressure Eion h me

C1=12*((2*3.141*me*k*Te)/h^2 )^1.5*exp(-Eion/(k*Te));
C2=Te+Tion;
C3=k*Tion;


conc=[ k*x(1)*C2+C3*x(2)-Pressure;
         sqrt(x(2)*C1)-x(1)];

end


При вызове её

Код:
>> guess=[1e23 1e26];
>> N=fsolve(@concentration,guess)
??? Error using ==> feval
Undefined function or method 'concentration' for input arguments of type 'double'.

Error in ==> fsolve at 253
            fuser = feval(funfcn{3},x,varargin{:});

Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.

Собственно в чем может быть проблема?
И может ли fsolve решить данную систему, как видите там циферки не простые, k,напр., это постоянная Больцмана, а h - Планка.
Копаю куда-то в сторону решения методом Ньютона ( а это уже нужно писать м.файл), но как я понимаю fsolve и решает систему данным методом.

Если изменить начальные значения, то выдает

Код:
>> guess=[1e23 1e30];
>> N=fsolve(@concentration,guess)
Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems; using
Levenberg-Marquardt algorithm instead.
> In fsolve at 323

Equation solved at initial point.

fsolve completed because the vector of function values at the initial
point is near zero as measured by the default value of the function tolerance,
and the problem appears regular as measured by the gradient.

<stopping criteria details>

N =
   100.0000000000000e+021    1.00000000000000e+030

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

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