Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
14.03.2016
Размер:
68.98 Кб
Скачать
<?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 &lt;ctype.h&gt;</span>
<span style='color: #006e28'>#include &lt;stdio.h&gt;</span>
<span style='color: #006e28'>#include &lt;math.h&gt;</span>
<span style='color: #006e28'>#include &lt;stdlib.h&gt;</span>
<span style='color: #006e28'>#include &lt;string.h&gt;</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&lt;=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&lt;=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&lt;=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 &lt;= 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 &lt; 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 &lt; 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 &lt;= (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&lt;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&lt;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 &lt; 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 &lt; 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'> &amp;&amp; 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 &amp;&amp; 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 &lt;= 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 &gt; </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 &gt; </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&lt;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 &lt; </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&lt;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&lt;</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&lt;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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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&lt;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&lt;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&lt;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&lt;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&gt;=</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&lt;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 &lt; 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'>]) &gt; 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 &lt; 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 Линейное уравнение общего вида