Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:KM2016 / Приложение к разделу 4 Линейное уравнение общего вида / fem4
.html<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Generator" content="Kate, the KDE Advanced Text Editor" />
<title>fem4.cpp</title>
</head>
<body>
<pre>
<span style='color: #888786'><i>// Приложение к разделу 4 Линейное уравнение общего вида </i></span>
<span style='color: #888786'><i>//fem4.h</i></span>
<span style='color: #006e28'>#include <ctype.h></span>
<span style='color: #006e28'>#include <stdio.h></span>
<span style='color: #006e28'>#include <math.h></span>
<span style='color: #006e28'>#include <stdlib.h></span>
<span style='color: #006e28'>#include <string.h></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funD( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funC( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funA( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> fun_q( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>void</span><span style='color: #141312'> K_ij(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> K [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> a, </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funD)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []), </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funC)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []), </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funA)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> bi []));</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>void</span><span style='color: #141312'> q_i(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> , </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *));</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> domik(</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> j, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> mp, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *xx);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> intgD(</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *));</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> intgCq(</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> , </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *), </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *));</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> intgA(</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> ,</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> , </span><span style='color: #0057ae'>int</span><span style='color: #141312'> , </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *), </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *));</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> i_max(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> p, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> V[]);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> lufact(</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> []);</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>void</span><span style='color: #141312'> SaveToFile(</span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'>*, </span><span style='color: #0057ae'>const</span><span style='color: #141312'> </span><span style='color: #0057ae'>char</span><span style='color: #141312'>* ); </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> output(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> test, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'>* x, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *b, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *solution, </span><span style='color: #0057ae'>const</span><span style='color: #141312'> </span><span style='color: #0057ae'>char</span><span style='color: #141312'>* filename);</span>
<span style='color: #141312'> </span>
<span style='color: #888786'><i>//fem4.cpp</i></span>
<span style='color: #006e28'>#include "fem4.h"</span>
<span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funD( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []) {</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> D [] = {</span><span style='color: #b08000'>1.0</span><span style='color: #141312'>, </span><span style='color: #b08000'>0.5</span><span style='color: #141312'>}; </span><span style='color: #888786'><i>// Задаём коэффициенты диффузии</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> Ni;</span>
<span style='color: #141312'> </span><span style='color: #888786'><i>// Находим в каком слое находится координата xi</i></span>
<span style='color: #141312'> <b>if</b> (xi<=b[</span><span style='color: #b08000'>1</span><span style='color: #141312'>]) Ni = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>else</b> Ni = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>return</b> D[Ni];</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funC( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []) {</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> C [] = {</span><span style='color: #b08000'>0.3</span><span style='color: #141312'>, </span><span style='color: #b08000'>0.6</span><span style='color: #141312'>}; </span><span style='color: #888786'><i>// Задаём коэффициенты конвекции</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> Ni;</span>
<span style='color: #141312'> </span><span style='color: #888786'><i>// Находим в каком слое находится координата xi</i></span>
<span style='color: #141312'> <b>if</b> (xi<=b[</span><span style='color: #b08000'>1</span><span style='color: #141312'>]) Ni = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>else</b> Ni = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>return</b> C[Ni];</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> funA( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []) {</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> A [] = {</span><span style='color: #b08000'>0.7</span><span style='color: #141312'>, </span><span style='color: #b08000'>0.4</span><span style='color: #141312'>}; </span><span style='color: #888786'><i>// Задаём коэффициенты поглощения</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> Ni;</span>
<span style='color: #141312'> </span><span style='color: #888786'><i>// Находим в каком слое находится координата xi</i></span>
<span style='color: #141312'> <b>if</b> (xi<=b[</span><span style='color: #b08000'>1</span><span style='color: #141312'>]) Ni = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>else</b> Ni = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>return</b> A[Ni];</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>static</span><span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> fun_q( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []) {</span>
<span style='color: #141312'> <b>return</b> (-</span><span style='color: #b08000'>6</span><span style='color: #141312'>*xi + </span><span style='color: #b08000'>1</span><span style='color: #141312'>);</span>
<span style='color: #141312'> </span><span style='color: #888786'><i>//return 3.14159*3.14159*sin(3.14159*x);</i></span>
<span style='color: #141312'> </span><span style='color: #888786'><i>// return x*x*x*x;</i></span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>int</span><span style='color: #141312'> main(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> argc,</span><span style='color: #0057ae'>char</span><span style='color: #141312'> *argv[]) {</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> a, *bx, *step, *hp, *hm;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> NL, *ib, knots_N, test;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *x, h, x_max;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *K, *q, *solution, result;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> NL = </span><span style='color: #b08000'>2</span><span style='color: #141312'>; </span><span style='color: #888786'><i>//число слоёв</i></span>
<span style='color: #141312'> a = </span><span style='color: #b08000'>0.5</span><span style='color: #141312'>; </span><span style='color: #888786'><i>// коэффициент в граничном условии</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b[</span><span style='color: #b08000'>3</span><span style='color: #141312'>] = {</span><span style='color: #b08000'>0.0</span><span style='color: #141312'>, </span><span style='color: #b08000'>0.2</span><span style='color: #141312'>, </span><span style='color: #b08000'>1.0</span><span style='color: #141312'>}; </span><span style='color: #888786'><i>// координаты границ слоёв</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> N[</span><span style='color: #b08000'>2</span><span style='color: #141312'>] = {</span><span style='color: #b08000'>3</span><span style='color: #141312'>, </span><span style='color: #b08000'>3</span><span style='color: #141312'>}; </span><span style='color: #888786'><i>// задаём число узлов внутри слоя, не считая узел на правой границе </i></span>
<span style='color: #141312'> </span>
<span style='color: #141312'> bx = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[NL+</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> step = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[NL];</span>
<span style='color: #141312'> ib = <b>new</b> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> [NL+</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> ib[</span><span style='color: #b08000'>0</span><span style='color: #141312'>]=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; </span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i <= NL; i++) { ib[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] = ib[i] + N[i]; } </span><span style='color: #888786'><i>//задаём номера - индексы - узлов на границах </i></span>
<span style='color: #141312'> bx[</span><span style='color: #b08000'>0</span><span style='color: #141312'>] = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < NL; i++) { </span><span style='color: #888786'><i>// шаг в слое и координаты левых границ слоёв (должны совпадать с b[i])</i></span>
<span style='color: #141312'> step[i] = (b[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>]-b[i])/N[i];</span>
<span style='color: #141312'> bx[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] = b[i] + step[i]*N[i];</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> knots_N = ib[NL]+</span><span style='color: #b08000'>1</span><span style='color: #141312'>; </span><span style='color: #888786'><i>// всего узлов, считая узел в начале координат</i></span>
<span style='color: #141312'> x = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span><span style='color: #888786'><i>// выделение памяти для координат узлов</i></span>
<span style='color: #141312'> hp = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span><span style='color: #888786'><i>// выделение памяти для шага впрёд из данного узла </i></span>
<span style='color: #141312'> hm = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span><span style='color: #888786'><i>// выделение памяти для шага впрёд из данного узла </i></span>
<span style='color: #141312'> K = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> [knots_N*knots_N]; </span><span style='color: #888786'><i>// выделение памяти для матрицы </i></span>
<span style='color: #141312'> q = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span><span style='color: #888786'><i>// выделение памяти для правой части</i></span>
<span style='color: #141312'> </span>
<span style='color: #141312'> x[</span><span style='color: #b08000'>0</span><span style='color: #141312'>] = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>; </span><span style='color: #888786'><i>// помещаем начало координат на левую границу и задаём координаты узлов</i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; k < NL; k++) {</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i = </span><span style='color: #b08000'>1</span><span style='color: #141312'>; i <= (ib[k+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] - ib[k]); i++) { </span>
<span style='color: #141312'> x[i+ib[k]] = bx[k] + step[k]*i; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> solution = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N];</span>
<span style='color: #141312'> K_ij(knots_N, K, x, b , a, funD, funC, funA) ; </span><span style='color: #888786'><i>// Матрица </i></span>
<span style='color: #141312'> q_i(knots_N, x, b, q, fun_q); </span><span style='color: #888786'><i>//Правая часть матричного уравнения</i></span>
<span style='color: #141312'> result = lufact(knots_N, K, q, solution);</span>
<span style='color: #141312'> test = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> result = output(test, knots_N, x, b, solution, </span><span style='color: #bf0303'>"result.txt"</span><span style='color: #141312'>);</span>
<span style='color: #141312'> <b>return</b> </span><span style='color: #b08000'>1</span><span style='color: #141312'>; </span>
<span style='color: #141312'>}</span>
<span style='color: #888786'><i>//Вывод решения в файл</i></span>
<span style='color: #0057ae'>int</span><span style='color: #141312'> output(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> test, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *x, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *b, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *solution, </span><span style='color: #0057ae'>const</span><span style='color: #141312'> </span><span style='color: #0057ae'>char</span><span style='color: #141312'> *filename) {</span>
<span style='color: #141312'> FILE *out;</span>
<span style='color: #141312'> out = fopen(filename, </span><span style='color: #bf0303'>"wt"</span><span style='color: #141312'>);;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> u_i, x_i, sol_i, q_i; </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> result;</span>
<span style='color: #141312'> <b>if</b> (test == </span><span style='color: #b08000'>1</span><span style='color: #141312'>) {</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'> x u(x) solution</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>);</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>;i<N;i++) {</span>
<span style='color: #141312'> x_i = x[i]; </span>
<span style='color: #141312'> u_i = pow(x_i,</span><span style='color: #b08000'>3.0</span><span style='color: #141312'>) - x_i;</span>
<span style='color: #141312'> </span><span style='color: #888786'><i>//u_i = sin(3.14159*x_i);</i></span>
<span style='color: #141312'> sol_i = solution[i];</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.7g%-12.7g</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>,x_i, u_i, sol_i);</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> result = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> <b>if</b> (test == </span><span style='color: #b08000'>0</span><span style='color: #141312'>) {</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'> x q(x) solution</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>);</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>;i<N;i++) {</span>
<span style='color: #141312'> x_i = x[i]; </span>
<span style='color: #141312'> sol_i = solution[i]; </span>
<span style='color: #141312'> q_i = fun_q(x_i,b);</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.7g%-12.7g</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>,x_i, q_i, sol_i);</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> result = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> <b>else</b> {</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'> Sorry, no solution!</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>);</span>
<span style='color: #141312'> result = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> fclose(out);</span>
<span style='color: #141312'> <b>return</b> result;</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>void</span><span style='color: #141312'> K_ij(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> K [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> a, </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funD)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []), </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funC)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b []), </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*funA)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b [])) {</span>
<span style='color: #888786'><i>// Вычисление матричных коэффициентов уравнения Кu=q </i></span>
<span style='color: #888786'><i>// N - число узлов</i></span>
<span style='color: #888786'><i>// x[] - координаты узлов</i></span>
<span style='color: #888786'><i>// a - коэффициент в граничном условии</i></span>
<span style='color: #888786'><i>// funD, funC, funA - функциональные коэффициенты дифф. уравннения</i></span>
<span style='color: #0057ae'>int</span><span style='color: #141312'> n = N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>; </span><span style='color: #888786'><i>// индекс узла на правой границе </i></span>
<span style='color: #0057ae'>double</span><span style='color: #141312'> hm, hp, D, C, A;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> j=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; j < N; j++) {</span>
<span style='color: #141312'> <b>if</b> (i==j) { </span><span style='color: #888786'><i>// главная диагональ</i></span>
<span style='color: #141312'> <b>if</b> (i==</span><span style='color: #b08000'>0</span><span style='color: #141312'> && j==</span><span style='color: #b08000'>0</span><span style='color: #141312'>) { </span><span style='color: #888786'><i>// главная диагональ первая строка левая граница</i></span>
<span style='color: #141312'> hp = x[</span><span style='color: #b08000'>1</span><span style='color: #141312'>]-x[</span><span style='color: #b08000'>0</span><span style='color: #141312'>];</span>
<span style='color: #141312'> K[i] = -a + intgD(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hp*hp) </span>
<span style='color: #141312'> - intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hp </span>
<span style='color: #141312'> - intgA(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, </span><span style='color: #b08000'>0</span><span style='color: #141312'>, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, </span><span style='color: #b08000'>0</span><span style='color: #141312'>, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik);</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> <b>else</b> <b>if</b> (i==n && j==n) { </span><span style='color: #888786'><i>// главная диагональ последняя строка, последний узел</i></span>
<span style='color: #141312'> hm = x[n]-x[n-</span><span style='color: #b08000'>1</span><span style='color: #141312'>]; </span>
<span style='color: #141312'> K[i*N+i] = intgD(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hm*hm) </span>
<span style='color: #141312'> + intgCq(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hm - </span>
<span style='color: #141312'> - intgA(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, j, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik); </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> { </span><span style='color: #888786'><i>// главная диагональ от второй до предпоследней строк</i></span>
<span style='color: #141312'> hm = x[i]-x[i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>]; hp = x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>]-x[i]; </span>
<span style='color: #141312'> K[i*N+i] = intgD(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hm*hm) + intgD(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hp*hp) </span>
<span style='color: #141312'> + intgCq(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hm - intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hp </span>
<span style='color: #141312'> - intgA(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>,i,-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik) - intgA(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik);</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> <b>if</b> ( (i-j)==</span><span style='color: #b08000'>1</span><span style='color: #141312'> ) { </span><span style='color: #888786'><i>// под главной диагональю</i></span>
<span style='color: #141312'> hm = x[i] - x[j];</span>
<span style='color: #141312'> K[i*N+j] = - intgD(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hm*hm) </span>
<span style='color: #141312'> - intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hm </span>
<span style='color: #141312'> - intgA(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik);</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> <b>if</b> ( (j-i)==</span><span style='color: #b08000'>1</span><span style='color: #141312'> ) { </span><span style='color: #888786'><i>// над главной диагональю</i></span>
<span style='color: #141312'> hp = x[j] - x[i];</span>
<span style='color: #141312'> D = intgD(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, x, b, funD)/(hp*hp);</span>
<span style='color: #141312'> C = intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funC, domik)/hp; </span>
<span style='color: #141312'> A = intgA(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, funA, domik);</span>
<span style='color: #141312'> K[i*N+j] = - D + C - A;</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> <b>else</b> { K[i*N+j] = </span><span style='color: #b08000'>0.</span><span style='color: #141312'>; } </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>void</span><span style='color: #141312'> q_i(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> knots_N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b[], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> q[], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*fun_q)( </span><span style='color: #0057ae'>double</span><span style='color: #141312'> xi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> b [])) {</span>
<span style='color: #888786'><i>//построение правой части уравнения Кu=q </i></span>
<span style='color: #888786'><i>// knots_N - число узлов</i></span>
<span style='color: #888786'><i>// x[] - координаты узлов</i></span>
<span style='color: #888786'><i>// funq(x) - правая часть диф. уравнения</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> n = knots_N - </span><span style='color: #b08000'>1</span><span style='color: #141312'>; </span><span style='color: #888786'><i>// n - индекс последнего узла</i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i <= n; i++) {</span>
<span style='color: #141312'> <b>if</b> (i == </span><span style='color: #b08000'>0</span><span style='color: #141312'>) {</span>
<span style='color: #141312'> q[i] = intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, fun_q, domik); </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> <b>if</b> (i == n) {</span>
<span style='color: #141312'> q[i] = intgCq(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, fun_q, domik); </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> {</span>
<span style='color: #141312'> q[i] = intgCq(-</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, -</span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, fun_q, domik) + intgCq(</span><span style='color: #b08000'>1</span><span style='color: #141312'>, i, </span><span style='color: #b08000'>1</span><span style='color: #141312'>, x, b, fun_q, domik); </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>double</span><span style='color: #141312'> domik(</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> j, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> mp, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *xx) {</span>
<span style='color: #888786'><i>// Пробная функция </i></span>
<span style='color: #888786'><i>// x - переменная интегрирования</i></span>
<span style='color: #888786'><i>// j - индекс узла</i></span>
<span style='color: #888786'><i>// mp = 1 - интегрируем вперёд, = -1 - назад</i></span>
<span style='color: #888786'><i>// xx[] - координаты всех узлов</i></span>
<span style='color: #888786'><i>// x_j - координата узла крыши домика </i></span>
<span style='color: #888786'><i>// h - шаг между узлами</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_j, h, value ;</span>
<span style='color: #141312'> x_j = xx[j];</span>
<span style='color: #141312'> <b>if</b> (mp > </span><span style='color: #b08000'>0</span><span style='color: #141312'>) {</span>
<span style='color: #141312'> h = xx[j+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] - x_j;</span>
<span style='color: #141312'> value = -</span><span style='color: #b08000'>1.0</span><span style='color: #141312'>/h*(x - x_j - h);</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> {</span>
<span style='color: #141312'> h = x_j - xx[j-</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> value = </span><span style='color: #b08000'>1.0</span><span style='color: #141312'>/h*(x - x_j + h); </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>return</b> value;</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>double</span><span style='color: #141312'> intgD(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> mp, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> i, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *x, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *b, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*fun)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *) ) {</span>
<span style='color: #888786'><i>// Интегрируем функцию funD из j-того узла i-той строки </i></span>
<span style='color: #888786'><i>// i - индекс строки, j - индекс узла</i></span>
<span style='color: #888786'><i>// mp - направление интегрирования от узла с индексом равным индексу строки: вперёд 1, или назад -1 </i></span>
<span style='color: #888786'><i>// x[] - координаты узлов</i></span>
<span style='color: #888786'><i>// b [] - координаты границ слоёв</i></span>
<span style='color: #888786'><i>// fun(x,b) - интегрируемая функция, x - переменная интегрирования</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> m = </span><span style='color: #b08000'>10</span><span style='color: #141312'>;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x0, h, dh, x_k, x_kp, s;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> <b>if</b> (mp > </span><span style='color: #b08000'>0</span><span style='color: #141312'>) { </span><span style='color: #888786'><i>// интегрируем вперёд от узла с индексом равным индексу строки</i></span>
<span style='color: #141312'> x0 = x[i]; </span><span style='color: #888786'><i>// нижний предел интеграла</i></span>
<span style='color: #141312'> h = x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] - x0;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> { </span><span style='color: #888786'><i>// интегрируем назад</i></span>
<span style='color: #141312'> x0 = x[i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> h = x[i] - x0;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> dh = h/m; </span><span style='color: #888786'><i>// шаг интегрирования</i></span>
<span style='color: #141312'> s = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; k<m; k++) {</span>
<span style='color: #141312'> x_k = x0 + dh*k;</span>
<span style='color: #141312'> x_kp = x_k + dh;</span>
<span style='color: #141312'> s = s + </span><span style='color: #b08000'>0.5</span><span style='color: #141312'>*dh*(fun(x_k, b) + fun(x_kp, b) );</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> <b>return</b> s;</span>
<span style='color: #141312'> }</span>
<span style='color: #0057ae'>double</span><span style='color: #141312'> intgCq(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> mp, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> i, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> mpi, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *x, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *b, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*fun)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *), </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*domik)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *)) { </span>
<span style='color: #888786'><i>// Интегрируем функцию fun * domik ( это funC,fun_q)</i></span>
<span style='color: #888786'><i>// i - индекс узла (строки для funq)</i></span>
<span style='color: #888786'><i>// mpi - верхний индекс у пробной функции "домик"</i></span>
<span style='color: #888786'><i>// mp = 1 интегрируем на шаг вперёд, или -1 назад из этого узла</i></span>
<span style='color: #888786'><i>// b [] - координаты границ слоёв</i></span>
<span style='color: #888786'><i>// x[] - координаты узлов</i></span>
<span style='color: #888786'><i>// fun(x,b) - интегрируемая функция, x - переменная интегрирования</i></span>
<span style='color: #888786'><i>// domik(x,j,mp,xx[]) - x - переменная интегрирования, j -индекс узла, </i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x0, h, dh, x_k, x_kp, s;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> m = </span><span style='color: #b08000'>3</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>if</b> (mp < </span><span style='color: #b08000'>0</span><span style='color: #141312'> ) { </span><span style='color: #888786'><i>// интегрируем назад </i></span>
<span style='color: #141312'> x0 = x[i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>]; </span><span style='color: #888786'><i>// нижний предел интеграла</i></span>
<span style='color: #141312'> h = x[i] - x0; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> { </span><span style='color: #888786'><i>// интегрируем вперёд</i></span>
<span style='color: #141312'> x0 = x[i];</span>
<span style='color: #141312'> h = x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>] - x0; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> dh = h/m;</span>
<span style='color: #141312'> s = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; k<m; k++) {</span>
<span style='color: #141312'> x_k = x0 + dh*k;</span>
<span style='color: #141312'> x_kp = x_k + dh;</span>
<span style='color: #141312'> s = s + </span><span style='color: #b08000'>0.5</span><span style='color: #141312'>*dh*( domik(x_k,i,mpi,x)*fun(x_k, b) + domik(x_kp,i,mpi,x)*fun(x_kp, b) );</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>return</b> s;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> intgA(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> mp, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> i, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> mpi, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> j, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> mpj, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *x, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *b,</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*fun)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *), </span><span style='color: #0057ae'>double</span><span style='color: #141312'> (*domik)(</span><span style='color: #0057ae'>double</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>int</span><span style='color: #141312'>, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *)) { </span>
<span style='color: #888786'><i>// Интегрируем функцию domik*funA*domik </i></span>
<span style='color: #888786'><i>// mp - направление интегрирования от узла с индексом равным индексу строки: вперёд 1, или назад -1 </i></span>
<span style='color: #888786'><i>// i - индекс узла равный индексу строки</i></span>
<span style='color: #888786'><i>// j - индекс того же или соседнего справа или слева узла</i></span>
<span style='color: #888786'><i>// mpi, mpj = (+) (-) - верхние индексы у пробной функции "домик"</i></span>
<span style='color: #888786'><i>// b [] - координаты границ слоёв</i></span>
<span style='color: #888786'><i>// x[] - координаты узлов</i></span>
<span style='color: #888786'><i>// fun(x,b) - интегрируемая функция, x - переменная интегрирования</i></span>
<span style='color: #888786'><i>// domik(x,j,mp,xx[]) - x - переменная интегрирования, j -индекс узла, </i></span>
<span style='color: #141312'> </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> m = </span><span style='color: #b08000'>3</span><span style='color: #141312'>;</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_j, x0, h, dh, x_k, x_kp, s;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> <b>if</b> (mp<</span><span style='color: #b08000'>0</span><span style='color: #141312'>) { </span><span style='color: #888786'><i>// интегрируем назад</i></span>
<span style='color: #141312'> x0 = x[i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>]; </span><span style='color: #888786'><i>// нижний предел интеграла</i></span>
<span style='color: #141312'> h = x[i] - x0; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>else</b> { </span><span style='color: #888786'><i>// интегрируем вперёд</i></span>
<span style='color: #141312'> x0 = x[i];</span>
<span style='color: #141312'> h = x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>]- x0;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> dh = h/m;</span>
<span style='color: #141312'> s = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; k<m; k++) {</span>
<span style='color: #141312'> x_k = x0 + dh*k;</span>
<span style='color: #141312'> x_kp = x_k + dh;</span>
<span style='color: #141312'> s = s + </span><span style='color: #b08000'>0.5</span><span style='color: #141312'>*dh*( domik(x_k,i,mpi,x)*fun(x_k, b)*domik(x_k,j,mpj,x) + </span>
<span style='color: #141312'> domik(x_kp,i,mpi,x)*fun(x_kp, b)*domik(x_kp,j,mpj,x) );</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> <b>return</b> s;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> lufact(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> A [], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> q[], </span><span style='color: #0057ae'>double</span><span style='color: #141312'> solution[]) {</span>
<span style='color: #888786'><i>// Вход - K - матрица размера NxN</i></span>
<span style='color: #888786'><i>// - q - матрица размера Nx1</i></span>
<span style='color: #888786'><i>// Выход - Х - матрица размера Nx1, содержащая решение KX=q</i></span>
<span style='color: #888786'><i>// Инициализация X, Y, временное сохранение матрицы С и строк</i></span>
<span style='color: #888786'><i>// заданной матрицы перестановок R</i></span>
<span style='color: #888786'><i>// double A[500][500]; </i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> *X, *Y, *C, *V, mult; </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> *R, *J, ip, d, result;</span>
<span style='color: #141312'> X = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[N]; </span>
<span style='color: #141312'> Y = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[N]; </span>
<span style='color: #141312'> C = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[N]; </span>
<span style='color: #141312'> V = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[N];</span>
<span style='color: #141312'> R = <b>new</b> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> [N]; </span>
<span style='color: #141312'> J = <b>new</b> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> [N]; </span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #141312'> X[i] = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>; Y[i] = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>; C[i] = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>; J[i] = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> R[i] = i; </span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> j;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> p=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; p < N; p++) {</span>
<span style='color: #888786'><i>// Выписываем столбец p </i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #141312'> V[i] = A[i*N+p];</span>
<span style='color: #141312'> } </span>
<span style='color: #888786'><i>// Находим номер строки главного элемента для столбца p </i></span>
<span style='color: #141312'> j = i_max(N,p,V);</span>
<span style='color: #141312'> J[p] = j; </span><span style='color: #888786'><i>// смещение строки с главным элементом относительно строки p</i></span>
<span style='color: #888786'><i>// Меняем местами строки p и j</i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #888786'><i>// Записывваем p-ю строку в С</i></span>
<span style='color: #141312'> C[i] = A[p*N+i];</span>
<span style='color: #141312'> } </span>
<span style='color: #888786'><i>// Записываем в p+j-ую строку p-ую строку </i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #141312'> A[p*N+i] = A[(p+j)*N+i];</span>
<span style='color: #141312'> }</span>
<span style='color: #888786'><i>// Записываем p-ую строку в p+j-ую строку </i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < N; i++) {</span>
<span style='color: #141312'> A[(p+j)*N+i] = C[i];</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> d = R[p];</span>
<span style='color: #141312'> R[p] = R[p+j];</span>
<span style='color: #141312'> R[p+j] = d;</span>
<span style='color: #141312'> <b>if</b> (A[p*N+p] == </span><span style='color: #b08000'>0</span><span style='color: #141312'>) {</span>
<span style='color: #141312'> printf(</span><span style='color: #bf0303'>"Матрица вырождена. Нет единственного решения!"</span><span style='color: #141312'>);</span>
<span style='color: #141312'> result = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>return</b> result;</span>
<span style='color: #141312'> }</span>
<span style='color: #888786'><i>// Вычисление множителя и размещение под диагональю матрицы К</i></span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=p+</span><span style='color: #b08000'>1</span><span style='color: #141312'>; k<N; k++) {</span>
<span style='color: #141312'> mult = A[k*N+p]/A[p*N+p];</span>
<span style='color: #141312'> A[k*N+p] = mult;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i = p+</span><span style='color: #b08000'>1</span><span style='color: #141312'>; i<N; i++) {</span>
<span style='color: #141312'> A[k*N+i] = A[k*N+i] - mult*A[p*N+i]; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> }</span>
<span style='color: #888786'><i>// Прямая прогонка: Решение для Y</i></span>
<span style='color: #141312'> Y[</span><span style='color: #b08000'>0</span><span style='color: #141312'>] = q[R[</span><span style='color: #b08000'>0</span><span style='color: #141312'>]];</span>
<span style='color: #888786'><i>//Y[0] = q[0];</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> M;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=</span><span style='color: #b08000'>1</span><span style='color: #141312'>; k<N; k++) {</span>
<span style='color: #141312'> M = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i<k; i++) { </span><span style='color: #888786'><i>// Скалярное произведение векторов</i></span>
<span style='color: #141312'> M = M + A[k*N+i]*Y[i]; </span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> Y[k] = q[R[k]] - M;</span>
<span style='color: #888786'><i>// Y[k] = q[k] - M;</i></span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> </span>
<span style='color: #888786'><i>// Обратная прогонка: Решение для X</i></span>
<span style='color: #141312'> X[N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>] = Y[N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>]/A[(N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>)*N+N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> solution[N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>] = X[N-</span><span style='color: #b08000'>1</span><span style='color: #141312'>];</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> k=N-</span><span style='color: #b08000'>2</span><span style='color: #141312'>; k>=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; k--) {</span>
<span style='color: #141312'> M = </span><span style='color: #b08000'>0.0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=k+</span><span style='color: #b08000'>1</span><span style='color: #141312'>; i<N; i++) {</span>
<span style='color: #141312'> M = M + A[k*N+i]*X[i];</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> X[k] = (Y[k] - M)/A[k*N+k]; </span>
<span style='color: #141312'> solution[k] = X[k];</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> result = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> <b>return</b> result;</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>int</span><span style='color: #141312'> i_max(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> N, </span><span style='color: #0057ae'>int</span><span style='color: #141312'> p, </span><span style='color: #0057ae'>double</span><span style='color: #141312'> V[]) {</span>
<span style='color: #141312'> </span><span style='color: #0057ae'>int</span><span style='color: #141312'> max_i;</span>
<span style='color: #141312'> max_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=p; i < N-</span><span style='color: #b08000'>2</span><span style='color: #141312'>; i++) {</span>
<span style='color: #141312'> <b>if</b> ( fabs(V[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>]) > fabs(V[i]) ) max_i = i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>-p;</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> <b>return</b> max_i;</span>
<span style='color: #141312'>}</span>
<span style='color: #0057ae'>void</span><span style='color: #141312'> SaveToFile(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> knots_N, </span><span style='color: #0057ae'>double</span><span style='color: #141312'>* x, </span><span style='color: #0057ae'>const</span><span style='color: #141312'> </span><span style='color: #0057ae'>char</span><span style='color: #141312'>* filename)</span>
<span style='color: #141312'>{</span>
<span style='color: #141312'> FILE *out;</span>
<span style='color: #141312'> out = fopen(filename, </span><span style='color: #bf0303'>"wt"</span><span style='color: #141312'>);;</span>
<span style='color: #141312'> </span>
<span style='color: #141312'> <b>for</b> (</span><span style='color: #0057ae'>int</span><span style='color: #141312'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i < knots_N; i++) </span>
<span style='color: #141312'> {</span>
<span style='color: #141312'> fprintf(out,</span><span style='color: #bf0303'>"%g</span><span style='color: #ff80e0'>\n</span><span style='color: #bf0303'>"</span><span style='color: #141312'>,x[i]);</span>
<span style='color: #141312'> } </span>
<span style='color: #141312'> </span>
<span style='color: #141312'> fclose(out);</span>
<span style='color: #141312'>}</span>
</pre></body>
</html>
Соседние файлы в папке Приложение к разделу 4 Линейное уравнение общего вида