Gistrec

Обратная задача 1 [Решена]

Oct 2nd, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. //
  2. // Файл example1.txt
  3. //
  4. 1 3
  5.  
  6. 0    0 0    100  0 0
  7. 200  0 0    300  0 0
  8. 500  0 0    600  0 0
  9. 1000 0 0    1100 0 0
  10.  
  11. 0.00530516
  12. 0.000265258
  13. 0.0000321525
  14.  
  15.  
  16.  
  17. //
  18. // Файл Source.cpp
  19. //
  20.  
  21. #include <iostream>
  22. #include <cassert>
  23. #include <fstream>
  24. #include <vector>
  25. #include <cmath>
  26.  
  27. using namespace std;
  28.  
  29. #define M_PI 3.1415926
  30. #define EPS  0.0000001
  31.  
  32. struct Point3d {
  33.     double x;
  34.     double y;
  35.     double z;
  36. };
  37.  
  38. struct Range {
  39.     Point3d start;
  40.     Point3d end;
  41. };
  42.  
  43. Range source; // Источник
  44. vector<Range>  receivers;  // Приёмники
  45. vector<double> potentials; // Разность потенциалов измеренное на каждом приёмнике
  46.  
  47. double calculatedI = 0.05;
  48. vector<double> calculatedPotential;
  49.  
  50. constexpr double sigma = 0.1;
  51. constexpr double goldenI = 1;
  52.  
  53.  
  54.  
  55.  
  56. double distance(Point3d first, Point3d second) {
  57.     return sqrt(pow(first.x - second.x, 2) +
  58.                 pow(first.y - second.y, 2) +
  59.                 pow(first.z - second.z, 2));
  60. }
  61.  
  62. void calculateNextPotentials() {
  63.     // Генерация синтетический данных
  64.     for (size_t i = 0; i < receivers.size(); i++) {
  65.         double U = calculatedI / (2 * M_PI * sigma) * ((1 / distance(source.end, receivers[i].start) - 1 / distance(source.start, receivers[i].start)) -
  66.                                                        (1 / distance(source.end, receivers[i].end) - 1 / distance(source.start, receivers[i].end)));
  67.         calculatedPotential[i] = U;
  68.         std::cout << "calculatedPotential[" << i << "] = " << U << std::endl;
  69.     }
  70. }
  71.  
  72. // Минимизируемый функционал
  73. double getF() {
  74.     double F = 0;
  75.  
  76.     for (size_t i = 0; i < receivers.size(); i++) {
  77.         F += 1 / potentials[i] * pow(potentials[i] - calculatedPotential[i], 2);
  78.     }
  79.  
  80.     return F;
  81. }
  82.  
  83. int main() {
  84.     ifstream input("example1.txt");
  85.     assert(input.is_open() && "Error while opening file");
  86.  
  87.     size_t sourcesCount;
  88.     size_t receiversCount;
  89.  
  90.     input >> sourcesCount;
  91.     input >> receiversCount;
  92.  
  93.     calculatedPotential.resize(receiversCount);
  94.  
  95.     // Считываем источник
  96.     input >> source.start.x >> source.start.y >> source.start.z;
  97.     input >> source.end.x   >> source.end.y   >> source.end.z;
  98.  
  99.     // Считываем приёмники
  100.     for (size_t i = 0; i < receiversCount; i++) {
  101.         Range receiver;
  102.  
  103.         input >> receiver.start.x >> receiver.start.y >> receiver.start.z;
  104.         input >> receiver.end.x   >> receiver.end.y   >> receiver.end.z;
  105.  
  106.         receivers.emplace_back(receiver);
  107.     }
  108.  
  109.  
  110.     // Считываем разность потенциалов на каждом приёмнике
  111.     for (size_t i = 0; i < receiversCount; i++) {
  112.         double potential;
  113.        
  114.         input >> potential;
  115.  
  116.         potentials.emplace_back(potential);
  117.     }
  118.     vector<double> diff(receivers.size(), 0);
  119.     calculateNextPotentials();
  120.  
  121.  
  122.     // ---------------------- //
  123.     while (getF() > EPS) {
  124.         double elemA = 0; // Элемент СЛАУ
  125.         double elemB = 0; // Правая часть уравнения
  126.         for (size_t i = 0; i < receivers.size(); i++) {
  127.             diff[i] = 1 / (2 * M_PI * sigma) * ((1 / distance(source.end, receivers[i].start) - 1 / distance(source.start, receivers[i].start)) -
  128.                 (1 / distance(source.end, receivers[i].end) - 1 / distance(source.start, receivers[i].end)));
  129.  
  130.             elemA += pow((1 / potentials[i]) * diff[i], 2);
  131.             elemB -= pow(1 / potentials[i], 2) * diff[i] * (calculatedPotential[i] - potentials[i]);
  132.         }
  133.         double deltaI = elemB / elemA;
  134.         calculatedI += deltaI;
  135.  
  136.         // Пересчитываем potenrial
  137.         calculateNextPotentials();
  138.  
  139.         std::cout << calculatedI << std::endl;
  140.     }
  141.     system("pause");
  142.     return 0;
  143. }
Add Comment
Please, Sign In to add comment