|
Текст подпрограммы и версий ef02r_c.zip |
Тексты тестовых примеров tef02r_c.zip |
Приближенное решение интегрального уравнения Фредгольма I рода в классе кусочно - выпуклых функций с ограниченной первой производной.
Решение интегрального уравнeния фредгольма I рода
b
∫ k(x, y) u(y) dy = f(x) , c ≤ x ≤ d ,
a
при априорно известной информации об ограниченности первой производной искомого решения u = u (y) и об участках знакопостоянства его кривизны сводится на основе метода квазирешений В.К.Иванова к задаче минимизации
d b
min ∫ ( ∫ k(x, y) u(y) dy - f(x) )2 dx
v, u (a) c a
на множестве кусочно - монотонных функций v (y) = u' (y), определенных на отрезке [a, b]
y
u(y) = u(a) + ∫ v(t) dt , a ≤ y ≤ b ,
a
и удовлетворяющих ограничениям
v1(y) ≤ v(y) ≤ v2(y) , a ≤ y ≤ b ,
v1 (y) и v2 (y) - заданные на отрезке [a, b] функции. Значение u (a) может считаться как известным, так и подлежащим определению.
Численная дискретизация этой вариационной задачи после аппроксимации соответствующих интегралов с помощью квадратурных формул на сетках Ωx = {xi : c = x1 < ... < xi < ... < xM = d} и Ωy = {yj : a = y1 < ... < yj < ... < yN = b} приводит к задаче квадратичного программирования
M N
(1) min ∑ pi ( ∑ dj ki j uj - fi )2
v, u1 i=1 j=1
при условии, что вектоp v = (v1, ..., vN - 1) удовлетворяет ограничениям
j -1
(2) uj = u1 + ∑ he ve , j = 2, ..., N
e=1
(3) v1 j ≤ vj ≤ v2 j , j = 1, ..., N-1
(4) mj ( vj + 1 - vj ) ≥ 0 , j = 1, ..., N-2 ,
где ki j = k (xi, yj), fi = f (xi), dj > 0 - коэффициенты квадратурной формулы трапеции на сетке Ωy , pi > 0 - весовые коэффициенты, hj = yj + 1 - yj - шаг сетки Ωy , v1j = v1 (yj), v2j = v2 (yj), параметры mj определяются условиями кусочной монотонности функции v = u' и принимают значения 1, 0 или -1.
Численное решение задачи (1) - (4) основано на методе проекции сопряженных градиентов, который позволяет проводить итерационный процесс минимизации в конечномерном пространстве W2, ρ1 с нормой
N-1
|| v || = ( || v || Q2 + ∑ ρj (vj - vj-1)2 )1/2 ,
j=2
N-1
|| v || Q = ( ∑ qj vj2 ) ,
j=1
qj > 0 и ρj ≥ 0 - заданные числа. Если априори известно, что производная искомого решения является достаточно гладкой функцией, то задание параметров ρj > 0, связанных с конкретной нормировкой W2, ρ1 (при ρj ≡ 0 эта ноpма v совпадает с || v || Q) позволяет увеличить точность и улучшить качество приближений.
Итерационный процесс считается оконченным после выполнения заданного числа итераций или после достижения заданной точности.
| 1. | А.Н.Тихонов, В.Я.Арсенин, Методы решения некорректных задач. M. "Hаука", 1974. |
| 2. | В.А.Морозов, Н.Л.Гольдман, М.К.Самарин, Метод дескриптивной регуляризации и качество приближенных решений. ИФЖ, т.33, N 6, 1977. |
| 3. | Ф.П.Васильев, Лекции по методам решения экстремальных задач. Изд - во МГУ, 1974. |
| 4. | Н.Л.Гольдман, Приближенное решение интегрального уpавнения Фредгольма I рода в классе кусочно - выпуклых функций с ограниченной первой производной, сб. "Численный анализ на ФОРТРАНе". Изд - во МГУ, 1978. |
int ef02r_c (integer *m, integer *n, real *a, real *f,
integer *ng, real *v1, real *v2, integer *mu, real *h, real *p,
real *q, real *r, real *e, integer *isp, integer *lu, real *u,
real *fu, integer *kn, real *b)
Параметры
| m - | заданная размерность вектоpа правой части f (тип: целый); |
| n - | заданная размерность вектоpа искомого решения u = (u1, ..., un) (тип: целый); |
| a - | заданный вещественный двумерный массив размерности m * n, элементы которого a (i, j) = ki j; |
| f - | заданный вещественный вектоp длины m, содержащий компоненты вектоpа правой части f; |
| ng - | заданный признак наличия ограничений на производную искомого решения (тип: целый); |
| ng = 0 - | если ограничения отсутствуют; |
| ng = 1 - | если выполнены ограничения (3); |
| ng = 2 - | если выполнены ограничения (4); |
| ng = 3 - | если выполнены ограничения (3) и (4); |
| v1 - | вещественный вектоp длины n, первые n - 1 компонент которого содержат нижние ограничения v1 j; |
| v2 - | вещественный вектоp длины n, первые n - 1 компонент которого содержат верхние ограничения v2 j; |
| mu - | целый вектоp длины n, первые n - 2 компонент которого содержат параметры mj; |
| h - | вещественный вектоp длины n, первые n - 1 компонент которого содержат шаги hj разностной сетки Ωy на отрезке [a, b]; |
| p - | вещественный вектоp длины m, содержащий весовые коэффициенты pi > 0; |
| q - | вещественный вектоp длины n, первые n - 1 компонент которого содержат весовые коэффициенты qj > 0; |
| r - | вещественный вектоp длины n + 1 значений параметров ρj таких, что: r (1) = 0., r (j) = ρj ≥ 0, j = 2, ..., n - 1, ρ (n) = 0., ρ (n + 1) = 0.; |
| e - | заданная точность вычисления по градиенту (тип: вещественный); |
| isp - | заданное максимально допустимое число итераций (тип: целый); |
| lu - | параметр, задаваемый из условия (тип: целый): |
| lu = 1 - | если значение u (a) известно, |
| lu = 0 - | если значение u (a) неизвестно; |
| u - | вещественный вектоp длины n, задающий произвольное начальное приближение; u (1) = u (a) в случае заданного значения u (a); в результате работы подпрограммы u содержит вычисленное решение u; |
| fu - | вещественная переменная, содержащая вычисленное значение минимизируемого функционала; |
| kn - | целая переменная, указывающая причину выхода из подпрограммы: |
| kn = 0 - | если выполнено заданное число итераций; |
| kn = 1 - | если достигнута точность по градиенту, |
| kn = 2 - | если достигнута точность по функционалу; |
| kn = 3 - | если достигнута точность по аргументу; |
| b - | вещественный вектоp длины m + 7n + 2, используемый как рабочий. |
Версии: нет
Вызываемые подпрограммы
| ef01r_c - | приближенное решение интегрального уравнения Фредгольма i рода в классе ограниченных кусочно - монотонных функций. |
Замечания по использованию
| 1. |
Кpоме искомого решения u подпрограмма позволяет получить приближение для его производной: компоненты вычисленного вектоpа v = (v1, ..., vn - 1) расположены в b (m + 1), ..., b (m + n - 1). | |
| 2. |
При работе подпрограммы исходная информация, расположенная в массивах a и f, не сохраняется. | |
| 3. | Справедливы замечания 3) - 5) к использованию подпрограммы ef01r_c. |
int main(void)
{
/* Initialized data */
static float v1[11] = { 0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
static int ng = 3;
static int lu = 1;
static int isp = 20;
static float v2[11] = { 1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,
0.f };
static int mu[11] = { 1,1,1,1,1,-1,-1,-1,-1,0,0 };
static float h__[11] = { .1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,0.f };
static float p[11] = { 1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f };
static float q[11] = { .05f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.05f };
static float r__[12] = { 0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
static int m = 11;
static int n = 11;
/* Builtin functions */
double sin(double);
/* Local variables */
extern int ef02r_c(int *, int *, float *, float *, int *, float *,
float *, int *, float *, float *, float *, float *, float *,
int *, int *, float *, float *, int *, float *);
static float a[121] /* was [11][11] */, b[90], e, f[11];
static int i__, i, j;
static float s, u[11], y, sf;
static int kn;
static float fu;
int i__1, i__2;
float r__1;
#define a_ref(a_1,a_2) a[(a_2)*11 + a_1 - 12]
e = 1e-7f;
i__1 = m;
for (i__ = 1; i__ <= i__1; ++i__) {
i__2 = n;
for (j = 1; j <= i__2; ++j) {
if (i__ - j != 0) {
goto l2;
} else {
goto l1;
}
l1:
a_ref(i__, j) = 1.f / q[i__ - 1];
goto l3;
l2:
a_ref(i__, j) = 0.f;
l3:
;
}
}
u[0] = -.45833333333333331f;
i__2 = n;
for (j = 2; j <= i__2; ++j) {
/* l4: */
u[j - 1] = 0.f;
}
sf = .025f;
y = -.5f;
i__2 = m;
for (i__ = 1; i__ <= i__2; ++i__) {
s = sf * (float)sin((float)(i__ * 123.456f + 789.f));
/* Computing 3rd power */
r__1 = y;
f[i__ - 1] = y - r__1 * (r__1 * r__1) / 3.f + s;
/* l5: */
y += h__[i__ - 1];
}
ef02r_c(&m, &n, a, f, &ng, v1, v2, mu, h__, p, q, r__, &e, &isp, &lu, u,
&fu, &kn, b);
for (i = 0; i <= 6; i+= 3) {
printf("\n %12.4e %12.4e %12.4e ",u[i], u[i+1], u[i+2]);
}
printf("\n %12.4e %12.4e \n",u[9], u[10]);
printf("\n %16.7e %5i \n",fu, kn);
return 0;
} /* main */
Результат:
u = ( -4.58e-1, -4.11e-1, -3.16e-1, -2.21e-1, -1.26e-1,
-3.13e-2, 7.87e-2, 1.73e-1, 2.68e-1, 3.64e-1, 4.58e-1 )