РефератыМатематикаПрПрименение численных методов для решения уравнений с частными производными

Применение численных методов для решения уравнений с частными производными

САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ


Кафедра «Прикладная математика»


ОТЧЕТ


ПО ВЫПОЛНЕННОЙ КУРСОВОЙ РАБОТЕ


Предмет «Численные методы»


«Применение численных методов для решения Уравнений с частными производными»


Санкт-Петербург 2008г.


Лабораторная работа N1 "Интерполирование алгебраическими многочленами"


Для решения задачи локального интерполирования алгебраическими многочленами в системе MATLAB предназначены функции polyfit (POLYnomial FITting - аппроксимация многочленом) и polyval (POLYnomial VALue - значение многочлена).


Функция polyfit (X,Y,n) находит коэффициенты многочлена степени n , построенного по данным вектора Х, который аппроксимирует данные вектора Y в смысле наименьшего квадрата отклонения. Если число элементов векторов X и Y равно n+1, то функция polyfit (X,Y,n) решает задачу интерполирования многочленом степени n.


Функция polyval (P,z) вычисляет значения полинома, коэффициенты которого являются элементами вектора P, от аргумента z . Если z – вектор или матрица, то полином вычисляется во всех точках z.


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
















X


0.0


1.0


2.0


3.0


4.0


Y


1.0


1.8


2.2


1.4


1.0



и вычисления ее приближенного значения в точке x* = 2.2 .



Задача 1 (задача локального интерполирования многочленами)


Построить интерполяционные многочлены 1-ой, 2-ой и 3-ей степени.


Вычислить их значения при x=x*.


Записать многочлены в канонической форме и построить их графики.


Решение задачи средствами системы MATLAB:


X=[0.0000 0.5000 1.0000 1.5000 2.0000 2.5000];


Y=[0.0378 0.0653 0.3789 1.0353 0.5172 0.9765];


xzv=1.61;


P1=polyfit(X(4:5),Y(4:5),1) Коэффициенты многочлена P1


P2=polyfit(X(3:5),Y(3:5),2) Коэффициенты многочлена P2


P3=polyfit(X(3:6),Y(3:6),3) Коэффициенты многочлена P3


Полученные таким образом коэффициенты интерполяционных многочленов и значения этих многочленов при x=x* :


P1 = -1.0362 2.5896


P2 = -2.3490 7.1853 -4.4574


P3 = 2.8692 -15.2604 25.8351 -13.0650


z1 = 0.9213


z2 = 1.0221


z3 = 0.9470


многочлены P1, P2, P3


P1
= -1.0362
*X+2.5896


P2
= -2.3490
*X2
+7.1853
*X+-4.4574


P3
= 2.8692
*X3
-15.2604
*X2
+ 25.8351
+ -13.0650


Для построения графиков интерполяционных многочленов следует создать векторы xi1, xi2, xi3, моделирующие интервалы (X(3):X(4)), (X(2):X(4)),(X(2):X(5)), соответственно, и вычислить значения многочленов P1, P2, P3 для элементов векторов xi1, xi2, xi3, соответственно:


xi1=X(4):0.05:X(5);


xi2=X(3):0.05:X(5);


xi3=X(3):0.05:X(6);


y1=polyval(P1,xi1);


y2=polyval(P2,xi2);


y3=polyval(P3,xi3);


plot(X,Y,'*k',xi1,y1,xi2,y2,xi3,y3);grid


Интерполирование нелинейной функцией Y=A*exp(-B*X)


y_l=log(Y)


Pu=polyfit(X(4:5),y_l(4:5),1)


z_l=(exp(Pu(2))*exp(Pu(1)*xzv))


Y=
8.3040*exp(-1.3880*X)


Функция plot с указанными аргументами строит табличные значения функции черными звездочками('*k'), а также графики многочленов P1 (по векторам xi1 и y1), P2 (по векторам xi2 и y2) и P3 (по векторам xi3 и y3), и функцией Y=A*exp(-B*X), соответственно синей, красной и зеленой кривыми.


plot(X,Y,'*k',xi1,y1,xi2,y2,xi3,y3,xi1,exp(Pu(2))*exp(Pu(1)*xi1));grid




Оценка погрешности интерполирования



При оценке погрешности решения задачи интерполирования в точке x* за погрешность epsk интерполяционного многочлена степени k принимается модуль разности значений этого многочлена и многочлена степени k+1 в точке x*.


С помощью уже полученных значений мы можем оценить погрешности интерполяционных многочленов P1 и P2 в точке x* , используя функцию abs
системы MATLAB для вычисления модуля:


eps1 = abs(z1-z2)


eps1 = 0.1008


eps2 = abs(z2-z3)


eps2 = 0.0751


Для оценки погрешности многочлена P3 необходимо предварительно вычислить


значение z4=P4(x*), а затем - eps3.


P4=polyfit(X,Y,4);z4=polyval(P4,xzv);


eps3=abs(z4-z3)


eps3 = 0.1450


«Построение сплайна»


X=[0.0000 0.5000 1.0000 1.5000 2.0000 2.5000];


Y=[0.0378 0.0653 0.3789 1.0353 0.5172 0.9765];


cs = spline(X,[0 Y 0]);


xx = linspace(0,2.5);


plot(X,Y,'*m',xx,ppval(cs,xx),'-k');


h=0.5


esstestvennii spline


A=[4 2 0 0 0 0


1 4 1 0 0 0


0 1 4 1 0 0


0 0 1 4 1 0


0 0 0 1 4 1


0 0 0 0 2 4]


B=[6*(Y(2)-Y(1))/h 0 0 0 0 6*(Y(length(Y))-Y(length(Y)-1))/h]


for i = 2:(length(Y)-1)


B(i)=(3/h)*(Y(i+1)-Y(i-1))


end


S=inv(A)*B'


otsutstvie uzla


A1=[1 0 -1 0 0 0


1 4 1 0 0 0


0 1 4 1 0 0


0 0 1 4 1 0


0 0 0 1 4 1


0 0 0 1 0 -1]


B1=[2*(2*Y(2)-Y(1)-Y(3))/h 0 0 0 0 2*(2*Y(length(Y)-1)-Y(length(Y))-Y(length(Y)-2))/h]


for i = 2:(length(Y)-1)


B1(i)=(3/h)*(Y(i+1)-Y(i-1))


end


S1=inv(A1)*B1'


c1 = spline(X,[S(2) Y S(5)]);


x1 = linspace(0,2.5,101);


c2 = spline(X,[S1(2) Y S1(5)]);


x2 = linspace(0,2.5,101);


plot(X,Y,'ob',xx,ppval(cs,xx),'-',x1,ppval(c1,x1),'*',x2,ppval(c2,x2),'^',xx,spline(X,Y,xx));


h =
0.5000


A =


4 2 0 0 0 0


1 4 1 0 0 0


0 1 4 1 0 0


0 0 1 4 1 0


0 0 0 1 4 1


0 0 0 0 2 4


B =
0.3300 0 0 0 0 5.5116


B =
0.3300 2.0466 0 0 0 5.5116


B =
0.3300 2.0466 5.8200 0 0 5.5116


B =
0.3300 2.0466 5.8200 0.8298 0 5.5116


B =
0.3300 2.0466 5.8200 0.8298 -0.3528 5.5116


S =


0.0052


0.1546


1.4230


-0.0266


-0.4869


1.6213


A1 =


1 0 -1 0 0 0


1 4 1 0 0 0


0 1 4 1 0 0


0 0 1 4 1 0


0 0 0 1 4 1


0 0 0 1 0 -1


B1 =
-1.1444 0 0 0 0 -3.9096


B1 = -1.1444 2.0466 0 0 0 -3.9096


B1 = -1.1444 2.0466 5.8200 0 0 -3.9096


B1 = -1.1444 2.0466 5.8200 0.8298 0 -3.9096


B1 = -1.1444 2.0466 5.8200 0.8298 -0.3528 -3.9096


S1 =


0.2496


0.1008


1.3940


0.1433


-1.1372


4.0529






Лабораторная работа N2 "Построение алгебраических многочленов наилучшего среднеквадратичного приближения"



X=[0.0000 0.5000 1.0000 1.5000 2.0000 2.5000];


Y=[0.0378 0.0653 0.3789 1.0353 0.5172 0.9765];


n=length(X)


TABL=[X,sum(X);Y,sum(Y);...


X.^2,sum(X.^2);...


X.*Y,sum(X.*Y);...


X.*X.*Y,sum(X.*X.*Y);...


X.^3,sum(X.^3);X.^4,sum(X.^4)];


TABL=TABL'


X Y X^2 X*Y X^2*Y X^3 X^4


0 0.0378 0 0 0 0 0


0.5000 0.0653 0.2500 0.0326 0.0163 0.1250 0.0625


1.0000 0.3789 1.0000 0.3789 0.3789 1.0000 1.0000


1.5000 1.0353 2.2500 1.5530 2.3294 3.3750 5.0625


2.0000 0.5172 4.0000 1.0344 2.0688 8.0000 16.0000


2.5000 0.9765 6.2500 2.4413 6.1031 15.6250 39.0625


7.5000 3.0110 13.7500 5.4402 10.8966 28.1250 61.1875 - Сумма


По данным таблицы запишем и решим нормальную систему МНК-метода:


1) дл многочлена первой степени


S1=[n, TABL(7,1);TABL(7,1) TABL(7,3)] матрица коэффициентов


T1=[TABL(7,2);TABL(7,4)] вектор правых частей


coef1=S1T1 решение нормальной системы МНК


A1=coef1(2);B1=coef1(1); коэффициенты многочлена 1-ой степени


S1 =


6.0000 7.5000


7.5000 13.7500


T1 =


3.0110


5.4402


coef1 =


0.0229


0.3832


2) дл многочлена второй степени


S2=[n TABL(7,1) TABL(7,3);TABL(7,1) TABL(7,3) TABL(7,6);TABL(7,3) TABL(7,6) TABL(7,7)] матрица коэффициентов


T2=[TABL(7,2);TABL(7,4);TABL(7,5)] вектор правых частей


coef2=S2T2 решение нормальной системы МНК


A2=coef2(3);B2=coef2(2);C2=coef2(1); коэффициенты многочлена 2-ой степени


S2 =


6.0000 7.5000 13.7500


7.5000 13.7500 28.1250


13.7500 28.1250 61.1875


T2 =


3.0110


5.4402


10.8966


coef2 =


-0.0466


0.5917


-0.0834


Для построения графиков функций y1=A1*x+B1 и y2=A2*x^2+B2*x+C2 с найденными коэффициентами зададим вспомогательный вектор абсциссы xi, а затем вычислим элементы векторов g1=A1*xi+B1 и g2=A2*xi^2+B2*xi+C2:


h=0.05;


xi=min(X):h:max(X);


g1=A1*xi+B1;


g2=A2*xi.^2+B2*xi+C2;


plot(X,Y,'*k',xi,g1,xi,g2);grid


coef1=polyfit(X,Y,1) коэффициенты многочлена первой степени


coef2=polyfit(X,Y,2) коэффициенты многочлена второй степени


coef1 = 0.3832 0.0229


coef2 = -0.0834 0.5917 -0.0466


Для построения графиков зададим вспомогательный вектор абсциссы xi, а затем c помощью функции polyval вычислим элементы векторов g1 и g2:


xi=min(X):0.1:max(X);


g1=polyval(coef1,xi);


g2=polyval(coef2,xi);


plot(X,Y,'*k',xi,g1,xi,g2);grid



Очевидно, что построенные таким способом графики совпадут с полученными ранее.


Для того, чтобы определить величину среднеквадратичного уклонения, вычислим суммы квадратов уклонений g1(x) и g2(x) от таблично заданной функции в узлах таблицы X а затем


G1=polyval(coef1,X);


G2=polyval(coef2,X);


delt1=sum((Y-G1).^2); delt1=sqrt(delt1/5)


delt2=sum((Y-G2).^2); delt2=sqrt(delt2/5)


Последние две строки можно заменить другими, если использовать функцию mean , вычислющую среднее значение:


delt1=mean(sum((Y-G1).^2))


delt2=mean(sum((Y-G2).^2))


delt1 = 0.2403


delt2 = 0.2335


delt1 = 0.2888


delt2 = 0.2725


Для нелинейной


X=[0.0000 0.5000 1.0000 1.5000 2.0000 2.5000];


Y=[0.0378 0.0653 0.3789 1.0353 0.5172 0.9765]


Y_o=Y


Y=1./(exp(Y))


n=length(X)


TABL=[X,sum(X);Y,sum(Y);... означает перенос строки


X.^2,sum(X.^2);...


X.*Y,sum(X.*Y);...


X.*X.*Y,sum(X.*X.*Y);...


X.^3,sum(X.^3);X.^4,sum(X.^4)];


/>

TABL=TABL'


По данным таблицы запишем и решим нормальную систему МНК-метода:


2) дл многочлена второй степени


S2=[n TABL(7,1) TABL(7,3);TABL(7,1) TABL(7,3) TABL(7,6);TABL(7,3) TABL(7,6) TABL(7,7)] матрица коэффициентов


T2=[TABL(7,2);TABL(7,4);TABL(7,5)] вектор правых частей coef2=S2T2 решение нормальной системы МНК


A2=coef2(3);B2=coef2(2);C2=coef2(1); коэффициенты многочлена 2-ой степени


Дл построения графиков функции y2=A2*x^2+B2*x+C2 с найденными коэффициентами зададим вспомогательный вектор абсциссы xi, а затем вычислим элементы векторов g1=A1*xi+B1 и g2=A2*xi^2+B2*xi+C2 :


h=0.05;


xi=min(X):h:max(X);


g2=log(1./(A2*xi.^2+B2*xi+C2));


plot(X,Y_o,'*k',xi,g2);grid


coef2=polyfit(X,Y,2) коэффициенты многочлена второй степени


Для построения графиков зададим вспомогательный вектор абсциссы xi, а затем c помощью функции polyval вычислим элементы векторов g1 и g2:


pause;


xi=min(X):0.1:max(X);


g2=polyval(coef2,xi);


plot(X,Y_o,'*k',xi,log(1./g2));grid


Очевидно, что построенные таким способом графики совпадут с полученными ранее.


Для того, чтобы определить величину среднеквадратичного уклонения, вычислим суммы квадратов уклонений g1(x) и g2(x) от таблично заданной функции в узлах таблицы X а затем


G2=polyval(coef2,X);


delt2=sum((Y-G2).^2); delt2=sqrt(delt2/5)


Последние две строки можно заменить другими, если использовать функцию mean , вычисляющую среднее значение:


delt2=mean(sum((Y-G2).^2))


Y = 0.0378 0.0653 0.3789 1.0353 0.5172 0.9765


Y_o = 0.0378 0.0653 0.3789 1.0353 0.5172 0.9765


Y = 0.9629 0.9368 0.6846 0.3551 0.5962 0.3766


n = 6


TABL =


0 0.9629 0 0 0 0 0


0.5000 0.9368 0.2500 0.4684 0.2342 0.1250 0.0625


1.0000 0.6846 1.0000 0.6846 0.6846 1.0000 1.0000


1.5000 0.3551 2.2500 0.5327 0.7990 3.3750 5.0625


2.0000 0.5962 4.0000 1.1924 2.3848 8.0000 16.0000


2.5000 0.3766 6.2500 0.9416 2.3539 15.6250 39.0625


7.5000 3.9122 13.7500 3.8196 6.4565 28.1250 61.1875


S2 =


6.0000 7.5000 13.7500


7.5000 13.7500 28.1250


13.7500 28.1250 61.1875


T2 =


3.9122


3.8196


6.4565


coef2 =


1.0178


-0.4243


0.0718


coef2 =


0.0718 -0.4243 1.0178


delt2 =


0.1199


delt2 =


0.0719



Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений


Эйлера явная


function dy=func(x,y)


dy=2*x*y


clear


X=[0.00000 0.10000 0.20000 0.30000 0.40000 0.50000];


Y=exp((X).^2);


Y0=input('Значение функции в точке 0 = ');


Y_n1=Y0;


for n=1:length(X)-1


Y_n1=Y_n1+0.1*2*X(n)*Y_n1;


Y_n(n)=Y_n1;


end


X1=0.00000:0.01:0.50000;


Y_sot=Y0;


for n=1:length(X1)


Y_sot=Y_sot+0.01*2*X1(n)*Y_sot;


Y_sto(n)=Y_sot;


end


X2=0.00000:0.001:0.50000;


Y_tys=Y0;


for n=1:length(X2)


Y_tys=Y_tys+0.001*2*X2(n)*Y_tys;


Y_ts(n)=Y_tys;


end


disp(' X Y h=0.1 h=0.01 h=0.001')


G1=Y_sto(10:10:end);


TABL=[X;Y;Y0,Y_n;...


Y_sto(1),G1;...


Y_ts(1),Y_ts(100:100:end)];


TABL=TABL';disp(TABL)


Значение функции в точке 0 = 1


X Y h=0.1 h=0.01 h=0.001


0 1.0000 1.0000 1.0000 1.0000


0.1000 1.0101 1.0000 1.0090 1.0099


0.2000 1.0408 1.0200 1.0387 1.0406


0.3000 1.0942 1.0608 1.0907 1.0938


0.4000 1.1735 1.1244 1.1683 1.1730


0.5000 1.2840 1.2144 1.2766 1.2833


Симметричная


clear


X=[0.00000 0.10000 0.20000 0.30000 0.40000 0.50000];


Y=exp((X).^2);


Y0=input('Значение функции в точке 0 = ');


Y_n1=Y0;


for n=1:length(X)-1


Y_n1=Y_n1*(1+0.1*X(n))/(1-0.1*(X(n)+0.1));


Y_n(n)=Y_n1;


end


X1=0.00000:0.01:0.50000;


Y_sot=Y0;


for n=1:length(X1)-1


Y_sot=Y_sot*(1+0.01*X1(n))/(1-0.01*(X1(n)+0.01));


Y_sto(n)=Y_sot;


end


X2=0.00000:0.001:0.50000;


Y_tys=Y0;


for n=1:length(X2)-1


Y_tys=Y_tys*(1+0.001*X2(n))/(1-0.001*(X2(n)+0.001));


Y_ts(n)=Y_tys;


end


disp(' X Y h=0.1 h=0.01 h=0.001')


G1=Y_sto(10:10:end);


TABL=[X;Y;Y0,Y_n;...


Y_sto(1),G1;...


Y_ts(1),Y_ts(100:100:end)];


TABL=TABL';disp(TABL)


Значение функции в точке 0 = 1


X Y h=0.1 h=0.01 h=0.001


0 1.0000 1.0000 1.0001 1.0000


0.1000 1.0101 1.0101 1.0101 1.0101


0.2000 1.0408 1.0410 1.0408 1.0408


0.3000 1.0942 1.0947 1.0942 1.0942


0.4000 1.1735 1.1745 1.1735 1.1735


0.5000 1.2840 1.2858 1.2840 1.2840


Эйлера неявная


clc


clear all


h_1=0.1;


X=0:h_1:0.5;


Y=exp(X.^2);


Yn=Y(1);


Y2=Yn+h_1*2*X(1);


или Y2=input('Введите значение Yn в точке X=0 =')


y_1(1)=Y2;


for i = 1:(length(Y)-1)


y_1(i+1)=y_1(i)/(1-h_1*2*X(i+1));


end


h_2=0.01;


X_2=0:h_2:0.5;


Y_2=exp(X_2.^2);


Y2=Yn+h_2*2*X(1);


y_2(1)=Y2;


for i = 1:(length(Y_2)-1)


y_2(i+1)=y_2(i)/(1-h_2*2*X_2(i+1));


end


h_3=0.001;


X_3=0:h_3:0.5;


Y_3=exp(X_3.^2);


Y2=Yn+h_3*2*X(1);


y_3(1)=Y2;


for i = 1:(length(Y_3)-1)


y_3(i+1)=y_3(i)/(1-h_3*2*X_3(i+1));


end


for k=1:5


r1(k)=y_2(k*10+1);


r2(k)=y_3(k*100+1);


end


TABL=[X; Y;... ... означает перенос строки


y_1;...


y_2(1),r1;...


y_3(1),r2];


TABL=TABL'


plot(X,Y,'-',X,y_1,X,[y_2(1),r1],X,[y_3(1),r2])


f=ode23('y_1',[0 0.5],1)


TABL =


0 1.0000 1.0000 1.0000 1.0000


0.1000 1.0101 1.0204 1.0111 1.0102


0.2000 1.0408 1.0629 1.0430 1.0410


0.3000 1.0942 1.1308 1.0977 1.0945


0.4000 1.1735 1.2291 1.1787 1.1740


0.5000 1.2840 1.3657 1.2916 1.2848



Задача
Коши


function [ output_args ] = koshi( input_args )


KOSHI Summary of this function goes here


Detailed explanation goes here


tspan=[0,1];


y0=[1.421,1];


[t,y]=ode45(@F,tspan,y0);


ode45(@F,tspan,y0);


hold on


plot([0 1],[1 1])



Подбор Альфа методом секущих


a=1;


y0=[1,a];


tspan=[0,1];


psi_old=a-1;


a_old=0.5;


i = 1;


eps = 1;


while (eps >= 0.000001) & (i < 10000)


[t,y]=ode45(@F,tspan,y0);


ode45(@F,tspan,y0)


psi=y(end,2)-1;


a_new=a-psi*(a-a_old)/(psi-psi_old)


eps = abs(psi);


a_old = a;


a = a_new;


y0=[1,a];


psi_old = psi


i = i + 1;


end


i


a_new = 0.5000


psi_old = -0.3935


a_new = 1.4655


psi_old = -0.8161


a_new = 1.4184


psi_old = 0.0419


a_new = 1.4215


psi_old = -0.0030


a_new = 1.4215


psi_old = -4.1359e-006


a_new = 1.4215


psi_old = 4.2046e-010


i = 7



Генерация матрицы 10*10 из элементов равномерно распределённых 1..10


function [ output_args ] = ravnomern10_10_1_10( input_args )


RAVNOMERN10_10_1_10 Summary of this function goes here


Detailed explanation goes here


round(rand(10,10)*9+1)


8 2 7 7 5 3 8 9 4 2


9 10 1 1 4 7 3 3 8 1


2 10 9 3 8 7 6 8 6 6


9 5 9 1 8 2 7 3 6 8


7 8 7 2 3 2 9 9 9 9


2 2 8 8 5 5 10 4 4 2


4 5 8 7 5 10 6 3 8 6


6 9 5 4 7 4 2 3 8 5


10 8 7 10 7 6 2 7 4 1


10 10 3 1 8 3 3 5 6 4


Решение краевой задачи методом сеток для УЧП.


e=0.01;


h=sqrt(e);


x=0:h:1;


y=0:h:1;


v=ones(11,11);


v(1,:)=0;


v(end,:)=1;


v(:,1)=(0:h:1)';


v(:,end)=(0:h:1)';


v=v.*((1*9+sum(0:h:1)+sum(0:h:1))/40)


v(1,:)=0;


v(end,:)=1;


v(:,1)=(0:h:1)';


v(:,end)=(0:h:1)';


surf(v);


d = e+1;


i=1


while d > e & i < 100


v1=v;


v1(1:10,:)=v1(2:11,:);


v1(11,:)=v(1,:);


v2=v;


v2(2:11,:)=v2(1:10,:);


v2(1,:)=v(11,:);


v3=v;


v3(:,1:10)=v3(:,2:11);


v3(:,11)=v(:,1);


v4=v;


v4(:,2:11)=v4(:,1:10);


v4(:,1)=v(:,11);


v_new=(v1+v2+v3+v4)/4;


d = max(max(abs(v(2:end-1,2:end-1)-v_new(2:end-1,2:end-1))))


v=v_new;


v(1,:)=0;


v(end,:)=1;


v(:,1)=(0:h:1)';


v(:,end)=(0:h:1)';


pause(0.5);


surf(v);


i = i + 1;


end;


Результат работы программы:


i = 1


d = 0.2250


d = 0.0875


d = 0.0500


d = 0.0344


d = 0.0297


d = 0.0245


d = 0.0199


d = 0.0175


d = 0.0154


d = 0.0137


d = 0.0120


d = 0.0108


d = 0.0093




HELM ВЫЧИСЛЯЕТ МЕТОДОМ МОНТЕ-КАРЛО (АЛГОРИТМ "БЛУЖДАНИЙ ПО СЕТКЕ") РЕШЕНИЕ ЗАДАЧИ ДИРИХЛЕ ДЛЯ УРАВНЕНИЯ ГЕЛЬМГОЛЬЦА В ЗАДАННОЙ ТОЧКЕ (x,y) ПРЯМОУГОЛЬНОЙ ОБЛАСТИ D, ОПРЕДЕЛЕННОЙ ГРАНИЦАМИ.


Код программ:


ЗАПИС КРАЕВЫХ УСЛОВИЙ В ЗАДАЧЕ


ДИРИХЛЕ ДЛЯ УРАВНЕНИЯ ГЕЛЬМГОЛЬЦА


function yp=funch(x,y);


if x=0,yp=y;end;


if y=0,yp=0;end;


if y=1,yp=1;end;


if x=1,yp=y;end;


function [z1,z2,z3]=helm(c,fun,xm,ym,gr,x0,y0,h,n);


HELM ВЫЧИСЛЯЕТ МЕТОДОМ МОНТЕ-КАРЛО (АЛГОРИТМ "БЛУЖДАНИЙ ПО СЕТКЕ")


РЕШЕНИЕ ЗАДАЧИ ДИРИХЛЕ ДЛЯ УРАВНЕНИЯ ГЕЛЬМГОЛЬЦА В ЗАДАННОЙ


ТОЧКЕ (x,y) ПРЯМОУГОЛЬНОЙ ОБЛАСТИ D, ОПРЕДЕЛЕННОЙ ГРАНИЦАМИ


0<=x<=xm, 0<=y<=ym


(УЧП) Uxx+Uyy-c*U=F(x,y)


(ГУ) U|г=G(x,y)


Входные данные:


c - КОЭФФИЦИЕНТ (функциональный) ЛЕВОЙ ЧАСТИ УЧП;


fun - ФУНКЦИЯ F(x,y) В ПРАВОЙ ЧАСТИ УЧП (ФУНКЦИЯ ПОЛЬЗОВАТЕЛЯ);


xm,ym - ГРАНИЦЫ ПРЯМОУГОЛЬНОЙ ОБЛАСТИ;


gr - ГРАНИЧНЫЕ УСЛОВИЯ (ФУНКЦИЯ ПОЛЬЗОВАТЕЛЯ);


x0,y0 - КООРДИНАТЫ ТОЧКИ, В КОТОРОЙ ИЩЕТСЯ РЕШЕНИЕ;


h - ШАГ СЕТКИ (ЗАДАЕТСЯ ПОЛЬЗОВАТЕЛЕМ);


n - ЧИСЛО ТРАЕКТОРИЙ.


Выходные данные:


z1 - ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ РЕШЕНИЯ;


z2 - ВЕРОЯТНАЯ ОШИБКА;


z3 - ВЕРХНЯЯ ГРАНИЦА ОШИБКИ.


Обращение: [z1,z2,z3]=helm(c,fun,xm,ym,gr,x0,y0,h,n)


global z


z=[];


i0=round(x0/h);


j0=round(y0/h);


im=round(xm/h);


jm=round(ym/h);


disp(' ')


disp(' Подождите, идет расчет.')


for count=1:n,


x=x0;y=y0;


i=i0;j=j0;


q=1;


tmp=4+eval(c)*h^2;


s=h^2*eval(fun)/tmp;


while all([i,j,im-i,jm-j]),


p=[0,1/4];p=[p,p(2)];


p=[p,1/4]; p=[p,p(4)];


alf=rand;


pp=max(find(alf>cumsum(p)));


if pp==1,j=j+1;end


if pp==2,j=j-1;end


if pp==3,i=i+1;end


if pp==4,i=i-1;end


x=i*h;y=j*h;


q=q*4/tmp;


s=s+q*h^2*eval(fun)/tmp;


end


s=s+q*feval(gr,x,y);


z=[z,s];


end


disp(' ');


disp(' РЕШЕНИЕ ЗАДАЧИ:');


disp(' ============================= ');


disp(' ')


disp(' при числе траекторий');disp(n);


disp('значение в точке с координатами ');


disp(' x0 y0');


disp([x0,y0]);


z1=mean(z);disp(' ПРИБЛИЖЕННОГО РЕШЕНИЯ - ');disp(z1);


z2=0.6745*std(z)/sqrt(n);disp(' ВЕРОЯТНОЙ ОШИБКИ - ');disp(z2);


z3=z2*3/0.6745;disp(' ВЕРХНЕЙ ГРАНИЦЫ ОШИБКИ - ');disp(z3);


ОБРАЩЕНИЯ К ФУНКЦИИ HELM:


global z


c='1';


f='0';


xm=1;ym=1;


gr='funch';


x0=0.6;y0=0.7;


h=0.1;


n=600;


[z1,z2,z3]=helm(c,f,xm,ym,gr,x0,y0,h,n);


Результат работы программы:


РЕШЕНИЕ ЗАДАЧИ:


при числе траекторий 600


значение в точке с координатами x0 y0 0.6000 0.7000


ПРИБЛИЖЕННОГО РЕШЕНИЯ - 0.2958


ВЕРОЯТНОЙ ОШИБКИ - 0.0089


ВЕРХНЕЙ ГРАНИЦЫ ОШИБКИ - 0.0397

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Применение численных методов для решения уравнений с частными производными

Слов:2502
Символов:28670
Размер:56.00 Кб.