Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
14.03.2016
Размер:
24.65 Кб
Скачать
<?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>fem3.cpp</title>
</head>
<body>
<pre>
<span style='color: #888786'><i>//Приложение к разделу 3 Однородный стержень</i></span>
<span style='color: #888786'><i>// fem3.h</i></span>
<span style='color: #888786'><i>/*</i></span>
<span style='color: #888786'><i>#include &lt;ctype.h&gt;</i></span>
<span style='color: #888786'><i>#include &lt;stdio.h&gt;</i></span>
<span style='color: #888786'><i>#include &lt;math.h&gt;</i></span>
<span style='color: #888786'><i>#include &lt;stdlib.h&gt;</i></span>
<span style='color: #888786'><i>#include &lt;string.h&gt;</i></span>


<span style='color: #888786'><i> int knots_N, test, result;</i></span>
<span style='color: #888786'><i> double *q, *x, *solution, *up, *down, *diag ;</i></span>
<span style='color: #888786'><i> double  h, x_max;</i></span>
<span style='color: #888786'><i> double  K[500][500];</i></span>
<span style='color: #888786'><i> </i></span>
<span style='color: #888786'><i> void q_i(void);</i></span>
<span style='color: #888786'><i> int output(int);</i></span>
<span style='color: #888786'><i> void K_ij(void);</i></span>
<span style='color: #888786'><i> double quad_m(double x_1,double x_2);</i></span>
<span style='color: #888786'><i> double quad_p(double x_1,double x_2);</i></span>
<span style='color: #888786'><i> void progon(int, double down[], double diag[], double up[], double q[]);</i></span>
<span style='color: #888786'><i> int i_max(int N, int p, double V[]);</i></span>
<span style='color: #888786'><i>*/</i></span>

<span style='color: #888786'><i>//fem3.cpp</i></span>

<span style='color: #006e28'>#include "fem3.h"</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'> x) { </span><span style='color: #888786'><i>// правая часть дифференциального уравнения</i></span>
<span style='color: #141312'>     </span><span style='color: #888786'><i>//return (-6*x);</i></span>
<span style='color: #141312'>     <b>return</b> </span><span style='color: #b08000'>3.14159</span><span style='color: #141312'>*</span><span style='color: #b08000'>3.14159</span><span style='color: #141312'>*sin(</span><span style='color: #b08000'>3.14159</span><span style='color: #141312'>*x);</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'>  x_max = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;    </span><span style='color: #888786'><i>// задаём длину стержня</i></span>
<span style='color: #141312'>  knots_N = </span><span style='color: #b08000'>7</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: #888786'><i>// при нулевых граничных условиях следует решать задачу только для внутренних узлов</i></span>
<span style='color: #141312'>  N = knots_N-</span><span style='color: #b08000'>2</span><span style='color: #141312'>;</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'>  h = x_max/(knots_N-</span><span style='color: #b08000'>1</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'>[N]; </span><span style='color: #888786'><i>// выделение памяти для решения</i></span>
<span style='color: #141312'>  K_ij(); </span><span style='color: #888786'><i>// матрица </i></span>
<span style='color: #141312'>  q_i();  </span><span style='color: #888786'><i>// правая часть матричного уравнения</i></span>
<span style='color: #141312'>  progon(N, down, diag, up, q);  </span><span style='color: #888786'><i>// решение матричного уравнения методом прогонки</i></span>
<span style='color: #141312'>  test = </span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'>  result = output(test);</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: #0057ae'>int</span><span style='color: #141312'> output(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> test) {</span>
<span style='color: #141312'>  FILE *out;</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'>  out = fopen(</span><span style='color: #bf0303'>"results.dat"</span><span style='color: #141312'>, </span><span style='color: #bf0303'>"wt"</span><span style='color: #141312'>);  </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'>    x_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; u_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; sol_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'>    fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.3g%-12.3g</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'>    <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-</span><span style='color: #b08000'>2</span><span style='color: #141312'>;i++) {</span>
<span style='color: #141312'>      x_i = x[i]+h;   </span>
<span style='color: #141312'>      </span><span style='color: #888786'><i>//u_i = pow(x_i,3.0) - x_i;</i></span>
<span style='color: #141312'>      u_i = sin(</span><span style='color: #b08000'>3.14159</span><span style='color: #141312'>*x_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'>    x_i = </span><span style='color: #b08000'>1</span><span style='color: #141312'>; u_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; sol_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'>    fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.3g%-12.3g</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'>    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'>    x_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; sol_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>; q_i = fun_q(x_i);</span>
<span style='color: #141312'>    fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.3g%-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'>    <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-</span><span style='color: #b08000'>2</span><span style='color: #141312'>;i++) {</span>
<span style='color: #141312'>      x_i = x[i]+h;  </span>
<span style='color: #141312'>      sol_i = solution[i]; </span>
<span style='color: #141312'>      q_i = fun_q(x_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, q_i, sol_i);</span>
<span style='color: #141312'>    }</span>
<span style='color: #141312'>    x_i = </span><span style='color: #b08000'>1</span><span style='color: #141312'>; sol_i = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'>    fprintf(out,</span><span style='color: #bf0303'>"%-12.3g%-12.3g%-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'>    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: #888786'><i>// Вычисление матричных элементов</i></span>
<span style='color: #0057ae'>void</span><span style='color: #141312'> K_ij(</span><span style='color: #0057ae'>void</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'> i=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i &lt; knots_N-</span><span style='color: #b08000'>2</span><span style='color: #141312'>; 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; knots_N-</span><span style='color: #b08000'>2</span><span style='color: #141312'>;j++) {</span>
<span style='color: #141312'>   <b>if</b> (i==j)         { K[i][i] = </span><span style='color: #b08000'>2.</span><span style='color: #141312'>/h; }</span>
<span style='color: #141312'>   <b>if</b> ((i-j)==</span><span style='color: #b08000'>1</span><span style='color: #141312'>)     { K[i][j] = -</span><span style='color: #b08000'>1.</span><span style='color: #141312'>/h;  }</span>
<span style='color: #141312'>   <b>if</b> ((i-j)==-</span><span style='color: #b08000'>1</span><span style='color: #141312'>)    { K[i][j] = -</span><span style='color: #b08000'>1.</span><span style='color: #141312'>/h;  } </span>
<span style='color: #141312'>   <b>if</b> (abs((i-j))&gt;</span><span style='color: #b08000'>1</span><span style='color: #141312'>) { K[i][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: #141312'>down = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span>
<span style='color: #141312'>diag = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_N]; </span>
<span style='color: #141312'>up = <b>new</b> </span><span style='color: #0057ae'>double</span><span style='color: #141312'>[knots_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; knots_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; knots_N;j++) {</span>
<span style='color: #141312'>    <b>if</b> (i==j)  { diag[i] = K[i][i]; }</span>
<span style='color: #141312'>    <b>if</b> ((i-j)==</span><span style='color: #b08000'>1</span><span style='color: #141312'>)     { down[i] = K[i][j];  }</span>
<span style='color: #141312'>    <b>if</b> ((i-j)==-</span><span style='color: #b08000'>1</span><span style='color: #141312'>)     { up[i] = K[i][j];  } </span>
<span style='color: #141312'>  }</span>
<span style='color: #141312'> }</span>
<span style='color: #141312'> </span>
<span style='color: #141312'>}</span>

<span style='color: #888786'><i>// Вычисление вектора правой части матричного уравнения</i></span>
<span style='color: #0057ae'>void</span><span style='color: #141312'> q_i(</span><span style='color: #0057ae'>void</span><span style='color: #141312'>) {</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'>  <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'>      x[i] = h*i;</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-</span><span style='color: #b08000'>2</span><span style='color: #141312'>; i++) {</span>
<span style='color: #141312'>   q[i] = quad_m(x[i],x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>]) + quad_p(x[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>],x[i+</span><span style='color: #b08000'>2</span><span style='color: #141312'>]);</span>
<span style='color: #141312'>  }</span>
<span style='color: #141312'>}</span>

<span style='color: #141312'> </span><span style='color: #888786'><i>// Интегрирование назад из i - того узла</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> quad_m(</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_1,</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_2) { </span>
<span style='color: #141312'>     </span><span style='color: #0057ae'>double</span><span style='color: #141312'> s = </span><span style='color: #b08000'>0</span><span style='color: #141312'>;</span>
<span style='color: #141312'>     </span><span style='color: #0057ae'>double</span><span style='color: #141312'> h, dh, x_i, x_k,x_kp;</span>
<span style='color: #141312'>     h = (x_2 - x_1);</span>
<span style='color: #141312'>     dh = h/</span><span style='color: #b08000'>5</span><span style='color: #141312'>;</span>
<span style='color: #141312'>     x_i = x_2; </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;</span><span style='color: #b08000'>5</span><span style='color: #141312'>; k++) {</span>
<span style='color: #141312'>         x_k = x_1 + 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*( (</span><span style='color: #b08000'>1</span><span style='color: #141312'>/h*(x_k - x_i + h))*fun_q(x_k) + (</span><span style='color: #b08000'>1</span><span style='color: #141312'>/h*(x_kp - x_i + h))*fun_q(x_kp) );</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: #888786'><i>// Интегрирование вперёд из i - того узла</i></span>
<span style='color: #141312'> </span><span style='color: #0057ae'>double</span><span style='color: #141312'> quad_p(</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_1,</span><span style='color: #0057ae'>double</span><span style='color: #141312'> x_2) { </span>
<span style='color: #141312'>     </span><span style='color: #0057ae'>double</span><span style='color: #141312'> h, dh, x_i, x_k, x_kp, s ;</span>
<span style='color: #141312'>     h = (x_2 - x_1);</span>
<span style='color: #141312'>     dh = h/</span><span style='color: #b08000'>5</span><span style='color: #141312'>;</span>
<span style='color: #141312'>     x_i = x_1; </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;</span><span style='color: #b08000'>5</span><span style='color: #141312'>; k++) {</span>
<span style='color: #141312'>         x_k = x_1 + 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*((-</span><span style='color: #b08000'>1</span><span style='color: #141312'>/h*(x_k - x_i - h))*fun_q(x_k) + (-</span><span style='color: #b08000'>1</span><span style='color: #141312'>/h*(x_kp - x_i - h))*fun_q(x_kp));</span>
<span style='color: #141312'>     }</span>
<span style='color: #141312'>     <b>return</b> s;</span>
<span style='color: #141312'> }</span>

<span style='color: #0057ae'>void</span><span style='color: #141312'> progon(</span><span style='color: #0057ae'>int</span><span style='color: #141312'> n,</span><span style='color: #0057ae'>double</span><span style='color: #141312'> c[],</span><span style='color: #0057ae'>double</span><span style='color: #141312'> a[],</span><span style='color: #0057ae'>double</span><span style='color: #141312'> b[],</span><span style='color: #0057ae'>double</span><span style='color: #141312'> g[])</span>
<span style='color: #888786'><i>//  Решение линейной трёхдиагональной матрицы методом прогонки</i></span>
<span style='color: #888786'><i>//   int n - порядок марицы</i></span>
<span style='color: #888786'><i>//   double c[] - входной вектор длины n - диагональные матричные элементы под главной диагональю</i></span>
<span style='color: #888786'><i>//               c[0] не используется</i></span>
<span style='color: #888786'><i>//   double a[] - входной вектор длины n - диагональные матричные элементы в главной диагонали</i></span>
<span style='color: #888786'><i>//               разрушается в процессе вычислений</i></span>
<span style='color: #888786'><i>//   double b[] - входной вектор длины n - диагональные матричные элементы над главной диагональю,</i></span>
<span style='color: #888786'><i>//                b[n-1] не используется</i></span>
<span style='color: #888786'><i>//   double g[ - входной вектор длины n - правая часть матричного уравнения,</i></span>
<span style='color: #888786'><i>//               при вычислении разрушается и заменяется решением</i></span>
<span style='color: #141312'>{</span>
<span style='color: #141312'>  </span><span style='color: #0057ae'>int</span><span style='color: #141312'> j,i;</span>
<span style='color: #141312'>  </span><span style='color: #0057ae'>double</span><span style='color: #141312'> r;</span>
<span style='color: #141312'>  <b>for</b>(i=</span><span style='color: #b08000'>1</span><span style='color: #141312'>;i&lt;n;i++) {</span>
<span style='color: #141312'>    j=i-</span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'>    r=c[i]/a[j];</span>
<span style='color: #141312'>    a[i]-=r*b[j];</span>
<span style='color: #141312'>    g[i]-=r*g[j];</span>
<span style='color: #141312'>  }</span>
<span style='color: #141312'>  j=n-</span><span style='color: #b08000'>1</span><span style='color: #141312'>;</span>
<span style='color: #141312'>  g[j]/=a[j];</span>
<span style='color: #141312'>  <b>for</b>(i=n-</span><span style='color: #b08000'>2</span><span style='color: #141312'> ; i&gt;=</span><span style='color: #b08000'>0</span><span style='color: #141312'>; i--){</span>
<span style='color: #141312'>    g[i]=(g[i]-b[i]*g[i+</span><span style='color: #b08000'>1</span><span style='color: #141312'>])/a[i];</span>
<span style='color: #141312'>  }</span>
<span style='color: #141312'>  solution = g;</span>
<span style='color: #141312'>}</span>

<span style='color: #888786'><i>// Результаты вычислений</i></span>
<span style='color: #888786'><i>/*</i></span>
<span style='color: #888786'><i> x          u(x)          solution</i></span>
<span style='color: #888786'><i>0           0           0           </i></span>
<span style='color: #888786'><i>0.167       0.4999996   0.5004563   </i></span>
<span style='color: #888786'><i>0.333       0.866025    0.8668159   </i></span>
<span style='color: #888786'><i>0.5         1           1.000913    </i></span>
<span style='color: #888786'><i>0.667       0.8660263   0.8668164   </i></span>
<span style='color: #888786'><i>0.833       0.5000019   0.5004569   </i></span>
<span style='color: #888786'><i>1           0           0         </i></span>
<span style='color: #888786'><i>*/</i></span></pre></body>
</html>
Соседние файлы в папке Приложение к разделу 3 Однородный стержень