Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

//1.

for (i=0; i<=n; i++) u[i][0]=mu(i*h); // k=0

u[0][1]=mu_1(tau); u[n][1]=mu_2(tau);

for (i=1; i<n; i++){xi = i*h; u[i][1]=mu(xi)+mu_0(xi)*tau+

tau2*(c2h2*(mu(xi-h)-2*mu(xi)+mu(xi+h))+f(xi,0));} // k=1

//2. k=2,...,m-1: u[i][k]:

for(k=2; k<=m;k++){ tk=k*tau; u[0][k]=mu_1(tk); u[n][k]=mu_2(tk);

for (i=1; i<n; i++){xi=i*h;

u[i][k]=2*u[i][k-1]-u[i][k-2]+

tau2*(c2h2*(u[i-1][k-1]-2*u[i][k-1]+u[i+1][k-1])+f(xi, tk-tau));}

} // end k

return 0;

}// Urkolstr

Приведем листинг работы программы.

Как видим, результаты расчета совпадают до трех знаков после запятой со значениями точного решения для t = T = 1.

8.2.2.  Уравнение колебаний струны. Неявная схема

Построим неявную схему для уравнения колебаний струны (8.11):

(8.25)

Для устойчивости схемы (8.25) параметры c, h, τ, σ должны удовлетворять условию [9]

.

Если ¼ ≤ σ ≤ 1/2, то схема (8.25) безусловно устойчива.

Шаблон схемы (8.25) изображен на рис. 8.3.

Рис. 8.3

Значения решения на нулевом и первом слоях вычисляют по формулам (8.22), (8.23). На каждом k-ом слое (k = 2, 3, …, M) решают методом прогонки систему уравнений относительно :

(8.26)

Алгоритм решения неявной разностной схемы для уравнения колебаний струны.

0. Построить сеточную область, выбирая шаги h, τ и параметр σ так, чтобы выполнялось условие устойчивости

.

Если ¼ ≤ σ ≤ 1/2, то можно выбирать h, τ произвольно.

1. Вычислить значения ui,k искомой функции для k = 0, 1:

НЕ нашли? Не то? Что вы ищете?

(8.27)

(8.28)

2. Значения ui,k+1 для каждого k > 0 находим методом прогонки, последовательными вычислениями в несколько этапов.

2.1. Вычислим правые части (8.26):

(8.29)

2.2. Вычислим прогоночные коэффициенты:

(8.30)

(8.31)

(8.32)

2.3. Вычислим решение ui,k+1:

(8.33)

(8.34)

Пример 8.2. Решить задачу из примера 8.1, используя неявную схему.

Решение на C++. Приведем текст программы, реализующей алгоритм (8.27) — (8.34):

#include <except. h>

#include <iostream. h>

#include <math. h>

long double f(long double x, long double t);

long double mu(long double x);

long double mu_0(long double x);

long double mu_1(long double t);

long double mu_2(long double t);

typedef long double (*PF)(long double, long double);

typedef long double (*PM)(long double);

int Urkolstr(PF f, PM mu, PM mu_0, PM mu_1, PM mu_2, long double c,

long double a, long double T, long double sgm,

long double **u, const int m, const int n);

int main(){

long double **u; long double c, a, T,sgm, uxt, uerr; int i, n,m, n1,m1;

PF pf; PM pmu, pmu_0, pmu_1, pmu_2;

cout <<" \n input c = " ; cin >> c;

cout <<" \n input a = " ; cin >> a;

cout <<" \n input T = " ; cin >> T;

cout <<" \n input n = " ; cin >> n; n1 = n+1;

cout <<" \n input m = " ; cin >> m; m1 = m+1;

cout <<" \n input sgm (1/4 <= sgm <= 1/2) = " ; cin >> sgm;

try {

u = new long double*[n1]; for(i=0;i<=n;i++) u[i]=new long double[m1];

}

catch (xalloc){cout <<"\n Could not allocate\n"; exit(-1);}

pf=f; pmu=mu; pmu_0=mu_0; pmu_1=mu_1; pmu_2=mu_2;

Urkolstr(pf, pmu, pmu_0, pmu_1, pmu_2, c, a, T, sgm, u, m, n);

cout << "\n function u: ";

for(i=0;i<=n;i++){cout<<"\n"; uxt=sin(1+i*a/n)*exp(2*T); uerr=fabs((uxt-u[i][m])/uxt);

cout<<"sin(1+x)exp(2T)= "<<uxt<<" u[i][m]= "<< u[i][m]<<" error= "<<uerr;}

cout << "\n Press Key and Enter to continue";

cin >> i; // for pause

for(i=0;i<=n;i++)delete[] u[i];

delete u;

return 0;

}//end main

long double f(long double x, long double t){

long double y;

y = 5*sin(1+x)*exp(2*t);

return y;

}// end f

long double mu(long double x){

long double y;

y = sin(1+x);

return y;

}// end mu

long double mu_0(long double x){

long double y;

y = 2*sin(1+x);

return y;

}// mu_0

long double mu_1(long double t){

long double y;

y = sin(1)*exp(2*t);

return y;

}// mu_1

long double mu_2(long double t){

long double y;

y = sin(2)*exp(2*t);

return y;

}// mu_2

int Urkolstr(PF f, PM mu, PM mu_0, PM mu_1, PM mu_2, long double c,

long double a, long double T, long double sgm,

long double **u, const int m, const int n){

long double *fi,*ai,*bi, h,tau, xi, tk, tau2,c2h2,h2c2t2s, h2c2s, sgm1,d; int i, k,n1;

h=a/n; tau=T/m; tau2=tau*tau/2; c2h2=c*c/(h*h);h2c2t2s=1/(c2h2*tau*tau*sgm);

n1=n+1; d=2+h2c2t2s; h2c2s=1/(c2h2*sgm); sgm1=(1-2*sgm)/sgm;

//1.

for (i=0; i<=n; i++) u[i][0]=mu(i*h); //(8.27) k=0

u[0][1]=mu_1(tau); u[n][1]=mu_2(tau);

for (i=1; i<n; i++){xi = i*h; u[i][1]=mu(xi)+mu_0(xi)*tau+

tau2*(c2h2*(mu(xi-h)-2*mu(xi)+mu(xi+h))+f(xi,0));} // (8.28) k=1

//2. k=1,2,...,m-1: u[i][k+1]:

try {fi = new long double [n1];ai = new long double [n1];

bi = new long double [n1];}

catch (xalloc){cout <<"\n Could not allocate\n"; exit(-1);}

for(k=1; k<m;k++){ tk=k*tau;

//2.1

for (i=1; i<n; i++){xi=i*h; fi[i]=h2c2t2s*(-2*u[i][k]+u[i][k-1])-

sgm1*(u[i-1][k]-2*u[i][k]+u[i+1][k])-

(u[i-1][k-1]-2*u[i][k-1]+u[i+1][k-1])-h2c2s*f(xi, tk);}

//2.2

ai[1]=1/d; bi[1]=(fi[1]-mu_1(tk+tau))/(-d);

for(i=2; i<n-1; i++){ai[i]=-1/(ai[i-1]-d);

bi[i]=(fi[i]-bi[i-1])/(ai[i-1]-d); }

bi[n-1]=(fi[n-1]-mu_2(tk+tau)-bi[n-2])/(ai[n-2]-d);

//2.3

u[0][k+1]=mu_1(tk+tau); u[n][k+1]=mu_2(tk+tau);

u[n-1][k+1]=bi[n-1];

for(i=n-2; i>0; i--)u[i][k+1]=ai[i]*u[i+1][k+1]+bi[i];

} // end k

delete[] bi;

delete[] ai;

delete[] fi;

return 0;

}// Urkolstr

Приведем листинг работы программы:

Как видим, результаты практически совпадают с решением, полученным с помощью явной схемы.

Отметим преимущества неявной схемы перед явной схемой:

В явной схеме надо выбирать шаги h и τ так, чтобы выполнялось условие устойчивости (условие Куранта) cτ < h. В неявной схеме можно выбирать шаги h и τ произвольно, если параметр σ принадлежит отрезку
[1/4; 1/2].

8.2.3.  Разностный метод для уравнения колебаний мембраны

Рассмотрим задачу для уравнения колебаний однородной прямоугольной мембраны с закрепленными краями

(8.37)

(8.38)

(8.39)

Введем сеточную область

Обозначим . Заменяя производные разностными формулами, для уравнения (8.37) получим разностное уравнение с порядком аппроксимации :

(8.40)

Мы получили явную разностную схему, аналогичную явной схеме для уравнения колебаний струны.

Решение на нулевом слое k = 0 получим из начального условия (8.38):

(8.41)

Чтобы найти решение на первом слое (k = 1) используем разложение в ряд Тейлора по переменной t в окрестности t = 0:

(8.42)

Учитывая начальные и краевые условия получим приближенные значения решения на первом слое:

Для вычисления значений на следующих слоях (k > 0) имеем из (8.40):

(8.43)

Приведем условие устойчивости явной схемы (8.41) — (8.43) [9]:

(8.44)

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8