S11as

Simple iterations

Apr 25th, 2020
574
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # метод простых итераций
  2. S=9;
  3. G=9;
  4. K=1;
  5. A = [1,5,1; 4,1,1; S,G, 2*(S+G+K)];
  6. c = [ (S - G + K + 10); (S - G +4*K-2); (2*((S-G)*(S+G+K)+G)+K*S)];
  7.  
  8. p=length(A);
  9. e=0.001;
  10.  
  11. A
  12. c
  13. #это алгоритм перестановки, долго обьяснять...
  14. table = [];
  15. for i=1:p
  16.   vector = A(:,i);
  17.   for j=1:length(vector)
  18.     # поиск последнего максимума
  19.     index = 1;
  20.     for k=1:length(vector)
  21.       if(vector(k)>=vector(index))
  22.         index = k;
  23.       end
  24.     end
  25.     vector(index) = -Inf;
  26.     table(j,i) = index;
  27.   end
  28. end
  29.  
  30.  
  31. can_be_transformed = true;
  32. the_same_numbers_in_row = true;
  33.  
  34.  
  35. while(the_same_numbers_in_row && can_be_transformed)
  36.   the_same_numbers_in_row = false;
  37.   first_row = table(1,:);
  38.   for i=1:length(first_row)-1
  39.     if(first_row(i) == first_row(i+1))
  40.       the_same_numbers_in_row = true;
  41.       #попытка удаления
  42.       del_col = table(:,i);
  43.       if(del_col(2) != 0)
  44.          del_col(1) = [];
  45.          del_col = [del_col;0];
  46.          table(:,i) = del_col;
  47.       else
  48.         #удалять нельзя, матрица не трансформирума
  49.         can_be_transformed = false;
  50.         break;
  51.       end
  52.     end
  53.   end
  54. end
  55.  
  56. if(can_be_transformed)
  57.   #трансформируем по полученной таблице
  58.   transformed_matrix = [];
  59.   transformed_vector = [];
  60.   transform_list = table(1,:)
  61.   for i=1:length(transform_list)
  62.     transformed_matrix(i,:) = A(transform_list(i),:);
  63.     transformed_vector(i) = c(transform_list(i));
  64.   end
  65.   transformed_matrix
  66.   transformed_vector
  67.  
  68.   #смысл алгоритма: у нас есть Ax=c, надо привести к виду x=Bx+d
  69.   #алгоритм приведения(метод Якоби):
  70.   # B(i,j) = -A(i,j)/A(i,i) B(i,i)=0
  71.   # d(i) = B(i)/A(i,i)
  72.  
  73.   #я не знаю почему, но если вместо alfa/betta попробовать написать большие буквы
  74.   #типо B или D (именно большие) то ошибка
  75.   #B = alfa; d = betta;
  76.   for i=1:p
  77.       alfa(i,:)=-transformed_matrix(i,:)/transformed_matrix(i,i);
  78.       alfa(i,i)=0;
  79.       betta(i)=transformed_vector(i)/transformed_matrix(i,i);
  80.   end
  81.  
  82.   B = alfa;
  83.   d = betta';
  84.  
  85.   B
  86.   d
  87.  
  88.   # условие сходимости, нужно вычислить первую матричную норму, за нас это делает функция,
  89.   # чтобы посчитать самому, надо сложнить модули коэффициентов каждой строки и выборать
  90.   # из них наибольшее число, если оно <= 1, продолжаем, иначе, считать данным методом
  91.   # не имеет смысла
  92.  
  93.     # дальше итерационная формула
  94.     # x(n+1) = Bx(n)+d
  95.  
  96.     # и да, нужно задать x(n) n=0, может это где-то там дано, но я возьму значение
  97.     # x0=d; поменять можно на x0 = [0; 0; 0]
  98.  
  99.     xCurrent = d;
  100.     xNext = B*xCurrent + d;
  101.  
  102.     # в задании  написано 3 итерации, но зачем так мало?
  103.     # если можно использовать математическую формулу (критерий окончания)
  104.     # ||x(n+1) - x(n)|| < epsilon
  105.     #(двойной модуль это нома вектора, что-то типо абсолютной величины,
  106.     # но для векторов
  107.  
  108.     # это надо для сравнения ответа с методом Гаусса, просто точности трех раз может
  109.     # не хватить
  110.     while norm(xNext - xCurrent, 1)>e
  111.       xCurrent = xNext;
  112.       xNext = B*xCurrent + d;
  113.     end
  114.  
  115.     # чтобы получить три итерации раскоментируйте это и закомментируйте while
  116.     # x будет третьей итерацией и ответом
  117.     #for i=1:2
  118.     #  xNext
  119.     #  xCurrent = xNext;
  120.     #  xNext = B*xCurrent + d;
  121.     #end
  122.  
  123.     x = xNext;
  124.     x
  125. else
  126.  printf("Матрица не трансформируема")
  127. end
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×