Advertisement
lapkin25

Обратная задача для уравнений сложного теплообмена

Aug 6th, 2023
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 KB | None | 0 0
  1. # See https://github.com/grenkin/joker-fdm
  2.  
  3. clear all;
  4. #more off;
  5. #format long;
  6.  
  7. global a
  8. global b
  9. global kappa_a
  10. global alpha
  11. global beta
  12. global gamma
  13. global theta_b
  14. global L
  15. global K
  16.  
  17. # исходные данные
  18. a = 0.92;
  19. b = 18.7;
  20. kappa_a = 0.01;
  21. alpha = 3.333333333;
  22. beta = 10;
  23. gamma = 0.3;
  24. theta_b = 0.4;
  25. L = 50;
  26.  
  27. # размер расчетной сетки
  28. K = 30;
  29.  
  30. # источники тепла
  31. global f_fun
  32. global num_sources
  33. f_fun = {@f1, @f2, @f3};
  34. num_sources = length(f_fun);
  35.  
  36. # мощности источников тепла
  37. global q
  38. q = zeros(num_sources);
  39.  
  40. # известные средние значения температуры по каждому источнику
  41. global r
  42. r = [4, 4, 3];
  43.  
  44. # источник тепла
  45. function ret = g_fun (x)
  46. global num_sources
  47. global f_fun
  48. global q
  49. s = 0;
  50. for i = 1:num_sources
  51. s += q(i) * f_fun{i}(x);
  52. endfor
  53. ret = s;
  54. endfunction
  55.  
  56. function ret = f_cos(a, b, x)
  57. if (x >= a && x <= b)
  58. ret = 0.5*(1 + cos(2 * pi * (x - (a + b) / 2) / (b - a)));
  59. else
  60. ret = 0.0;
  61. endif
  62. endfunction
  63.  
  64. function ret = f1 (x)
  65. ret = f_cos(10, 20, x);
  66. # if (x >= 10 && x <= 20)
  67. # ret = 1.0;
  68. # else
  69. # ret = 0.0;
  70. # endif
  71. endfunction
  72.  
  73. function ret = f2 (x)
  74. ret = f_cos(30, 40, x);
  75. # if (x >= 30 && x <= 40)
  76. # ret = 1.0;
  77. # else
  78. # ret = 0.0;
  79. # endif
  80. endfunction
  81.  
  82. function ret = f3 (x)
  83. ret = f_cos(45, 50, x);
  84. # if (x >= 45 && x <= 50)
  85. # ret = 1.0;
  86. # else
  87. # ret = 0.0;
  88. # endif
  89. endfunction
  90.  
  91. function [r_vals, theta] = calc_heat ()
  92. global a
  93. global b
  94. global kappa_a
  95. global alpha
  96. global beta
  97. global gamma
  98. global theta_b
  99. global L
  100. global K
  101. global f_fun
  102. global num_sources
  103.  
  104. data.N = N = 2; # число уравнений
  105. data.M = M = 1; # число слоев
  106. data.a(1, 1) = a;
  107. data.a(2, 1) = alpha;
  108.  
  109. fm = {@(x, p) b*kappa_a*x^4*sign(x), @(x, p) -b*kappa_a*x;
  110. @(x, p) -kappa_a*x^4*sign(x), @(x, p) kappa_a*x};
  111. dfm = {@(x, p) 4*b*kappa_a*abs(x)^3, @(x, p) -b*kappa_a;
  112. @(x, p) -kappa_a*4*abs(x)^3, @(x, p) kappa_a};
  113. data.f = data.df = cell(N, M, N);
  114. for j = 1 : M
  115. for i = 1 : N
  116. for k = 1 : N
  117. data.f{i, j, k} = fm{i, k};
  118. data.df{i, j, k} = dfm{i, k};
  119. endfor
  120. endfor
  121. endfor
  122.  
  123. data.b = [ beta, beta ; gamma, gamma ];
  124. data.w = [ beta * theta_b, beta * theta_b ; gamma * theta_b ^ 4, gamma * theta_b ^ 4 ];
  125.  
  126. data.G = [ ];
  127.  
  128. addpath("joker-fdm/bvp1d");
  129. grid_info = get_grid_info(L, K);
  130. xgrid = linspace(0, L, grid_info.nodes);
  131. data.g = zeros(N, grid_info.nodes);
  132. data.g(1, :) = arrayfun(@g_fun, xgrid);
  133. data.g(2, :) = zeros(1, grid_info.nodes);
  134. for i = 1 : N
  135. for k = 1 : N
  136. data.p(i, k, :) = zeros(1, grid_info.nodes);
  137. endfor
  138. endfor
  139.  
  140. guess = zeros(N, grid_info.nodes);
  141. tol = 1e-4;
  142. sol = solve_bvp1d(grid_info, data, guess, tol);
  143. theta = sol(1, :);
  144. phi = sol(2, :);
  145.  
  146. #{
  147. figure
  148. plot(xgrid, theta, "r", "linewidth", 2);
  149. xlabel("x");
  150. ylabel("theta");
  151. figure
  152. plot(xgrid, phi, "b", "linewidth", 2);
  153. xlabel("x");
  154. ylabel("phi");
  155. #}
  156.  
  157. r_vals = zeros(num_sources, 1);
  158. for i = 1:num_sources
  159. # вычисляем интеграл от f_fun{i} * theta
  160. r_vals(i) = trapz(xgrid, arrayfun(f_fun{i}, xgrid) .* theta);
  161. endfor
  162. endfunction
  163.  
  164. function u = calc_linearized (theta, ii)
  165. global a
  166. global b
  167. global kappa_a
  168. global alpha
  169. global beta
  170. global gamma
  171. global theta_b
  172. global L
  173. global K
  174. global f_fun
  175. global num_sources
  176.  
  177. data.N = N = 2; # число уравнений
  178. data.M = M = 1; # число слоев
  179. data.a(1, 1) = a;
  180. data.a(2, 1) = alpha;
  181.  
  182. fm = {@(x, p) b*kappa_a*4*abs(p)^3*x, @(x, p) -b*kappa_a*x;
  183. @(x, p) -kappa_a*4*abs(p)^3*x, @(x, p) kappa_a*x};
  184. dfm = {@(x, p) b*kappa_a*4*abs(p)^3, @(x, p) -b*kappa_a;
  185. @(x, p) -kappa_a*4*abs(p)^3, @(x, p) kappa_a};
  186. data.f = data.df = cell(N, M, N);
  187. for j = 1 : M
  188. for i = 1 : N
  189. for k = 1 : N
  190. data.f{i, j, k} = fm{i, k};
  191. data.df{i, j, k} = dfm{i, k};
  192. endfor
  193. endfor
  194. endfor
  195.  
  196. data.b = [ beta, beta ; gamma, gamma ];
  197. data.w = [ 0, 0 ; 0, 0 ];
  198.  
  199. data.G = [ ];
  200.  
  201. addpath("joker-fdm/bvp1d");
  202. grid_info = get_grid_info(L, K);
  203. xgrid = linspace(0, L, grid_info.nodes);
  204. data.g = zeros(N, grid_info.nodes);
  205. data.g(1, :) = arrayfun(f_fun{ii}, xgrid);
  206. data.g(2, :) = zeros(1, grid_info.nodes);
  207. for i = 1 : N
  208. for k = 1 : N
  209. data.p(i, k, :) = theta(:);
  210. endfor
  211. endfor
  212.  
  213. guess = zeros(N, grid_info.nodes);
  214. tol = 1e-4;
  215. sol = solve_bvp1d(grid_info, data, guess, tol);
  216. u = sol(1, :);
  217. z = sol(2, :);
  218. endfunction
  219.  
  220. function jac = calc_jacobian_naive (r_vals)
  221. global q
  222. global num_sources
  223. delta_q = 0.0001; # шаг дифференцирования
  224.  
  225. q0 = q;
  226. for i = 1:num_sources
  227. q = q0;
  228. q(i) += delta_q;
  229. [new_r_vals, theta] = calc_heat();
  230. jac(:, i) = (new_r_vals - r_vals) / delta_q;
  231. endfor
  232. endfunction
  233.  
  234. function jac = calc_jacobian (theta)
  235. global q
  236. global num_sources
  237. global L
  238. global K
  239. global f_fun
  240.  
  241. xgrid = linspace(0, L, K + 1);
  242. for i = 1:num_sources
  243. u_i = calc_linearized(theta, i);
  244. for j = 1:num_sources
  245. jac(j, i) = trapz(xgrid, arrayfun(f_fun{j}, xgrid) .* u_i);
  246. endfor
  247. endfor
  248. endfunction
  249.  
  250. q = [0.1; 0.1; 0.1];
  251. [r_vals, theta] = calc_heat();
  252.  
  253. #xgrid = linspace(0, L, 150);
  254. #plot(xgrid, arrayfun(@(x) f1(x) + f2(x) + f3(x), xgrid));
  255.  
  256. #r_vals
  257. #jac = calc_jacobian_naive(r_vals);
  258. #jac
  259.  
  260. #jac = calc_jacobian(theta)
  261.  
  262. function [y, jac] = opt_f (x)
  263. global num_sources
  264. global q
  265. global r
  266. for i = 1:num_sources
  267. q(i) = x(i);
  268. endfor
  269. for i = 1:num_sources
  270. printf("%f ", q(i));
  271. endfor
  272. printf("\n");
  273. y = zeros (num_sources, 1);
  274. for j = 1:num_sources
  275. [r_vals, theta] = calc_heat();
  276. for i = 1:num_sources
  277. y(i) = r_vals(i) - r(i);
  278. endfor
  279. if (nargout == 2)
  280. jac = calc_jacobian(theta);
  281. endif
  282. endfor
  283. endfunction
  284.  
  285. #[qq, fval, info] = fsolve (@opt_f, q, optimset ("jacobian", "on"))
  286.  
  287. q1_min = 0;
  288. q1_max = 5;
  289. q2_min = 0;
  290. q2_max = 5;
  291. qn = 50;
  292. q1grid = linspace(q1_min, q1_max, qn);
  293. q2grid = linspace(q2_min, q2_max, qn);
  294. func_vals1 = zeros(qn);
  295. func_vals2 = zeros(qn);
  296. #j_val = 1;
  297. q(3) = 0;
  298. for q1_ind = 1:qn
  299. for q2_ind = 1:qn
  300. q1_val = q1grid(q1_ind);
  301. q2_val = q2grid(q2_ind);
  302. q(1) = q1_val;
  303. q(2) = q2_val;
  304. [r_vals, theta] = calc_heat();
  305. func_vals1(q1_ind, q2_ind) = r_vals(1);
  306. func_vals2(q1_ind, q2_ind) = r_vals(2);
  307. endfor
  308. endfor
  309. figure
  310. contour(q1grid, q2grid, func_vals1, 0:15, 'k', 'ShowText', 'on')
  311. hold on
  312. contour(q1grid, q2grid, func_vals2, 0:15, 'k', '--', 'ShowText', 'on')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement