Текст подпрограммы и версий ef01r_p.zip |
Тексты тестовых примеров tef01r_p.zip |
Приближенное решение интегрального уравнения Фредгольма I рода в классе ограниченных кусочно - монотонных функций.
Приближенное решение интегрального уравнения Фредгольма I рода
b ∫ k(x, y) u(y) dy = f(x) , c ≤ x ≤ d , a
при априорно известной информации о качественном поведении искомого решения u = u (y) осуществляется методом квазирешений В.К.Иванова путем сведения к решению задачи квадратичного программирования с линейными ограничениями
(1) || K D u - f ||p2 = inf || K D v - f ||p2 , v∈G
где K - известная матрица порядка M * N с элементами ki j , которая в зависимости от ядра k (x, y) и способа его аппроксимации может быть матрицей общего вида, либо симметричной, циркулянтной, теплицевой и т.п.,
f = ( f1, ..., fM ) - известный M - мерный вектор ,
u = ( u1, ..., uN ) - искомый N - мерный вектор приближенного решения,
D - диагональная матрица коэффициентов квадратурной формулы dj , j = 1, ..., N,
M
|| Z ||p2 = ∑ pi zi2 , pi > 0 - весовые коэффициенты.
i=1
Линейные ограничения G представляют собой одно из множеств G1, G2 или G1 ∩ G2, где
G1 = { v = (v1, ..., vN) : aj ≤ vj ≤ bj , j = 1, ..., N } , G2 = { v = (v1, ..., vN) : mj (vj + 1 - vj) ≥ 0 , j = 1, ..., N - 1 } ,
a = (a1, ..., aN), b = (b1, ..., bN) - заданные N - мерные векторы нижних и верхних ограничений в G1; параметры mj определяются условиями кусочной монотонности и принимают значения 1, 0 или -1.
B случае отсутствия ограничений решается задача безусловной минимизации.
Численное решение задачи (1) основано на методе проекции сопряженных градиентов, который позволяет проводить итерационный процесс в конечномерном пространстве W2, ρ1 с нормой
N || v || = ( || v || 2Q + ∑ ρj (vj - vj - 1)2 )1/2 , j=2 N || v || Q = ( ∑ q j vj2 )1/2 , j=1
q j > 0 и ρj ≥ 0 - заданные числа. Если априори известно, что искомое решение достаточно гладкое, то задание параметров ρj > 0, связанных с конкретной нормировкой W2, ρ1 ( при ρj≡0 эта ноpма v совпадает с || v || Q ), позволяет увеличить точность и улучшить качество приближенного решения.
Итерационный процесс считается оконченным после выполнения заданного числа итераций или после достижения заданной точности.
B используемом алгоритме матрица K участвует лишь в операциях умножения матрицы на вектоp и умножения транспонированной матрицы на вектоp. Эти операции выделены в отдельную подпрограмму, благодаря чему пользователь может максимально полно учесть специфику матрицы K.
B самой подпрограмме EF01R матрица K не используется, поэтому способ ее представления не регламентируется.
1. | А.Н.Тихонов, В.Я.Арсенин, Методы решения некорректных задач, M., "Hаука", 1974. |
2. | В.А.Морозов, Н.Л.Гольдман, М.К.Самарин. Метод дескриптивной регуляризации и качество приближенных решений, ИФЖ, т. 33, N 6, 1977. |
3. | Ф.П.Васильев, Лекции по медодам решения экстремальных задач. Изд - во МГУ, 1974. |
procedure EF01R(var M :Integer; var N :Integer; var A :Array of Real; var F :Array of Real; NG :Integer; var AU :Array of Real; var BU :Array of Real; var MU :Array of Integer; var P :Array of Real; var Q :Array of Real; var D :Array of Real; var R :Array of Real; E :Real; ISP :Integer; var U :Array of Real; var FU :Real; var KN :Integer; var B :Array of Real; EF01R0 :Proc_EF01R);
Параметры
M - | заданная размерность вектоpа правой части f (тип: целый); |
N - | заданная размерность вектоpа искомого решения u (тип: целый); |
A - | заданный вещественный массив, содержащий информацию о матрице K; параметр A используется только в подпрограмме пользователя OP (см. дальше), и поэтому в данной подпрограмме его размерность не фиксируется; |
F - | вещественный вектоp длины M, содержащий компоненты вектоpа правой части f; |
NG - | заданный признак наличия ограничений на искомое решение (тип: целый): |
NG = 0 - | если ограничения отсутствуют, |
NG = 1 - | если требуется найти u ∈ G1, |
NG = 2 - | если требуется найти u ∈ G2, |
NG = 3 - | если требуется найти u ∈ G1 ∩ G2; |
AU - | вещественный вектоp длины N, содержащий компоненты вектоpа нижних ограничений a; |
BU - | вещественный вектоp длины N, содержащий компоненты вектоpа верхних ограничений b; |
MU - | целый вектоp длины N, первые N - 1 компоненты которого содержат параметры mj, определяемые условиями кусочной монотонности; |
P - | вещественный вектоp длины M, содержащий весовые коэффициенты pi > 0; |
Q - | вещественный вектоp длины N, содержащий весовые коэффициенты q j > 0; |
D - | вещественный вектоp длины N, содержащий коэффициенты квадратурной формулы d j > 0; |
R - | вещественный вектоp длины N + 1 значений параметров ρj : R (1) = 0., R (J) = ρj ≥ 0 , J = 2, ..., N , R (N + 1) = 0 ; |
E - | заданная точность вычисления по градиенту (тип: вещественный); |
ISP - | заданное максимально допустимое число итераций (тип: целый); |
U - | вещественный вектоp длины N, задающий произвольное начальное приближение; в результате работы подпрограммы содержит вычисленное решение u; |
FU - | вещественная переменная, содержащая вычисленное значение функционала невязки || K D u - f ||p2; |
KN - | целая переменная, указывающая причину выхода из подпрограммы: |
KN = 0 - | если выполнено заданное число итераций, |
KN = 1 - | если достигнута точность по градиенту, |
KN = 2 - | если достигнута точность по функционалу, |
KN = 3 - | если достигнута точность по аргументу; |
B - | вещественный вектоp длины M + 7N + 2, используемый как рабочий; |
OP - |
имя подпрограммы пользователя, вычисляющей векторы
w = K v
и
w = K' v
(см. замечания по использованию);
первый оператор подпрограммы должен иметь вид: |
M, N - | параметры, описанные выше; |
A - | заданный вещественный массив, содержащий информацию о матрице K; способ представления матрицы K в массиве A определяется пользователем; |
V - | вещественный вектоp длины max (M, N), содержащий компоненты вектоpа v; |
W - | вещественный вектоp длины max (M, N), содержащий компоненты вычисленного вектоpа w; |
NOP - |
управляющий параметр (тип: целый);
при NOP = 1 должен быть вычислен вектоp w с компонентами N wi = ∑ ki j vj , i = 1, ..., M , j=1 при NOP = 2 должен быть вычислен вектоp w с компонентами M wj = ∑ kj i vi , j = 1, ..., N . i=1 |
Версии: нет
Вызываемые подпрограммы
IA01R - | среднеквадратичная аппроксимация одномерной дискретной функции на множестве кусочно - монотонных функций. |
Замечания по использованию
1. |
Различные способы аппроксимации интегрального уpавнения приводят к различному определению элементов ki j и d j. Например, при гладком ядре ki j = k (xi, yj), xi: c = x1 < x2 < ... < xM = d, xi + 1 = xi + hix - узлы на отрезке [c, d], yj: a = y1 < y2 < ... < yN = b, yj + 1= yj + hjy - узлы на отрезке [a, b], dj - коэффициенты выбранной квадратурной формулы, а при негладком ядре xi+1 yj+1 ki j = 1/h1x ∫ ∫ k (x, y) dx dy , dj ≡ 1 . xi yj | |
2. |
При обращении к данной подпрограмме в качестве фактического параметра, соответствующего параметру OP, можно указывать имена следующих имеющихся в библиотеке служебных подпрограмм : EF01R1 - если матрица K имеет общий вид и задается двумерным массивом A размерности M * N : A [I, J] = kI J , I = 1, 2, ..., M, J = 1, 2, ..., N ; EF01R2 - если матрица K симметричная ( т.е. если ядро симметрично, k (x, y) = k (y, x) и a = c, b = d, hix = hjy = h , M = N ) и задается одномерным массивом A в компактной форме; при работе подпрограммы EF01R2 вызывается подпрограмма AM16R - вычисление произведения вещественной симметричной матрицы на вещественный вектоp; EF01R3 - если матрица K теплицева ( т.е. если k (x, y) = k (x - y) , a = c, b = d, hix = hjy = h, M = N ) и задается одномерным массивом A длины 2N - 1, содержащим элементы первого столбца и первой строки матрицы K в следующем порядке : kN1, ..., k21, k11, k12, ..., k1N ; EF01R4 - если матрица K циркулянтная ( т.е. k (x, y) = k (x - y), a = c, b = d, hix = hjy = h, M = N и, кpоме того, ядро k (t) периодично с периодом T = b - a ) и задается одномерным массивом A длины N, содержащим элементы первого столбца матрицы K : k11, k21, ..., kN1. | |
3. |
B случае NG = 0 или NG = 2 массивы AU и BU в вычислениях не используются и для них не следует резервировать память. Соответствующим фактическим параметpом может быть произвольный идентификатор. Это замечание относится и к массиву MU в случае NG = 0 или NG = 1. | |
4. |
Весовые коэффициенты pi ( i = 1, ..., M ) и qj ( j = 1, ..., N ), задаваемые векторами P и Q, могут быть коэффициентами квадратурных формул или задаваться из других соображений, в частности, можно положить pi ≡ 1, qj ≡ 1. Если f (xi) = fi + ξi, где fi = f (xi) - точное значение правой части, ξi - нормально распределенная случайная величина с дисперсией D ξi = σi2 и M ξi = 0, то можно положить pi = 1 / σi2. | |
5. |
Величины, определяющие точность вычисления по аргументу и по функционалу, заданы в самой подпрограмме согласовано с величиной E. | |
6. |
Если выход из подпрограммы произошел через заданное
число итераций (KN = 0), то для продолжения
итерационного процесса (например, после выдачи на печать
промежуточных результатов) можно поступить следующим образом:
_1: EF01R (M, N, A, F, NG, AU, BU, MU, P, Q, D, R, E, ISP, U, FU, KN, OP); if (KN<0) then goto _2 else if (KN=0) then goto _1 else goto _2; _2: ... |
Матрица K имеет общий вид
Unit tef01r_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, EF01R_p, EF01R1_p; function tef01r: String; implementation function tef01r: String; var M,N,NG,ISP,_i,KN :Integer; E,FU :Real; B :Array [0..25] of Real; const A :Array [0..8] of Real = ( 3.0,1.0,5.0,1.0,-3.0,2.0,1.0,2.0,1.0 ); F :Array [0..2] of Real = ( 4.0,3.0,4.0 ); MU :Array [0..2] of Integer = ( 1,1,0 ); P :Array [0..2] of Real = ( 1.0,1.0,1.0 ); Q :Array [0..2] of Real = ( 1.0,1.0,1.0 ); D :Array [0..2] of Real = ( 1.0,1.0,1.0 ); R :Array [0..3] of Real = ( 0.0,0.0,0.0,0.0 ); U :Array [0..2] of Real = ( 0.0,0.0,0.0 ); AU :Array [0..2] of Real = ( -10.0,-10.0,-10.0 ); BU :Array [0..2] of Real = ( 10.0,10.0,10.0 ); label _1,_2; begin Result := ''; M := 3; N := 3; NG := 2; E := 1.E-7; ISP := 20; _1: EF01R(M,N,A,F,NG,AU,BU,MU,P,Q,D,R,E,ISP,U,FU,KN,B,EF01R1); Result := Result + Format('%s',[' U= ']); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[U[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format(' %20.16f',[FU]) + #$0D#$0A; if ( KN ) < 0 then goto _2 else if ( KN ) > 0 then goto _2 else goto _1; _2: UtRes('tef01r',Result); { вывод результатов в файл tef01r.res } exit; end; end. Unit ef01r1_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc; procedure ef01r1(M :Integer; N :Integer; var A :Array of Real; var V :Array of Real; var W :Array of Real; NOP :Integer); implementation procedure ef01r1(M :Integer; N :Integer; var A :Array of Real; var V :Array of Real; var W :Array of Real; NOP :Integer); var I,J :Integer; label _1,_2,_3,_4,_5; begin case NOP of 1: goto _1; 2: goto _3; end; _1: for I:=1 to M do begin W[I-1] := 0.0; for J:=1 to N do begin W[I-1] := W[I-1]+A[(I-1)+(J-1)*M]*V[J-1]; _2: end; end; goto _5; _3: for J:=1 to N do begin W[J-1] := 0.0; for I:=1 to M do begin W[J-1] := W[J-1]+A[(I-1)+(J-1)*M]*V[I-1]; _4: end; end; _5: end; end. Результат: U = (-1., 2., 5.)