На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Коротко о разделе:
Здесь разрешается создавать темы, относящиеся к любому языку программирования, для которого не существует раздела на форуме (например, Lisp, Tcl/Tk, FORTRAN и т.д.). Если раздел для нужного Вам языка есть, большая просьба создавать тему в нем.
Вопросы, связанные с JScript, Perl, PHP обсуждаются в разделе WWW Masters.

Обратите внимание:
1. Прежде чем задать вопрос, воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали.
2. Если Ваш вопрос связан с конкретным языком программирования, обязательно укажите название языка в имени темы.
3. Постарайтесь давать темам информативные названия. Темы с названиями типа "Помогите, горю" будут удалены.
4. Помните, чем грамотней будет задан Ваш вопрос, тем больше будет у Вас шансов получить на него ответ. Как правильно задавать вопросы
5. Ипользуйте тег [ code ] ...текст программы... [ /code ] для выделения текста программы.

Просьбы выполнить какую-либо работу за автора в этом разделе не обсуждаются. Темы с подобными просьбами будут перемещены или удалены. Для заказов у нас существуют специальные разделы: Разовые заказы и подработка, ПОМОЩЬ СТУДЕНТАМ.

Если кто не понял (а такие есть) — чтобы за вас решали ваши задачки, идите на другие ресурсы.

Полезные ссылки:
Есть. ;)
Наши Исходники | GPSS (en), GPSS (ru) (!) | Common Lisp | Tcl/Tk | Haskell | Lua
Модераторы: B.V.
  
> Собственные значения и векторы
    Здравствуйте!!! Написал код, для поиска собственных значений и векторов методом вращений Якоби
    но препод сказал, что он коряв с точки зрения программирования.
    Сможете ответить, в чём проявляется корявость?
    Скрытый текст
    ExpandedWrap disabled
      restart;
      with(linalg):
      n:=10;
      N:=5;
      j:=1.5+0.1*n;
      k:=n;
      l:=n;  
      A:=matrix([[j,0.5*j,0,0.2*l,0],[0.5*j,j,0.3*j,0,0.1*l],[0,0.3*j,10,-0.3*j,0.5*l],[0.2*k,0,-0.3*j,j,-0.1*j],[0,0.1*k,0.5*k,-0.1*j,j]]);
      eigenvectors(A);
      B:=A: k:=0: flag:=0: eps:=0.001:
      while (flag = 0) do
      m:=abs(B[1,2]):
      iStr:=1: iCol:=2:
      for i from 1 to N do
      for j from 1 to N do
      if (i < j) and (j > 2) then
      if (m < abs(B[i,j])) then
      m:=abs(B[i,j]):
      iStr:=i: iCol:=j:
      end if: end if: end do: end do:
      if abs(m) <= eps then
      flag:=1:
      else
      phi:=evalf((1/2)*arctan(2*B[iStr,iCol]/(B[iStr,iStr]-B[iCol,iCol]))):
      H[k]:=diag(1,1,1,1,1):
      H[k][iStr,iStr]:=cos(phi):
      H[k][iStr,iCol]:=-sin(phi):
      H[k][iCol,iStr]:=sin(phi):
      H[k][iCol,iCol]:=cos(phi):
      if k = 0 then
      G:=H[0]:
      end if:
      #print(B);
      #print(H[k]);
      B:=multiply(transpose(H[k]), multiply(B,H[k])):
      if k <> 0 then
      G:=multiply(G,H[k]):
      end if:
      k:=k+1:
      end if: end do:
      #print(k);
      G:=multiply(seq(H[i],i=0..k-1)):
      for i from 1 to N do
      lambda[i]:=B[i,i];
      e[i]:=col(-G,i);
      end do;
      Из недостатков я бы отметил такие:
      1. Всё без разметки - тяжело читать (у меня так, по крайней мере, отображается).
      2. Я так и не понял где гарантия, что при арктангенсе на нуль не поделим?
      3. Синус и косинус дважды считается (мелочь, впрочем).
        Цитата Славян @
        тяжело читать

        а как подкорректировать код, чтобы был легко читаем
          Ну пробелы там порасставлять, и в таком стиле:
          ExpandedWrap disabled
            if A
                 if B
                 end if
            end if
          Сообщение отредактировано: Славян -
            Цитата Славян @
            где гарантия, что при арктангенсе на нуль не поделим?

            там условия if нужно?

            Добавлено
            так правильно?
            ExpandedWrap disabled
              r:=B[iStr,iStr]-B[iCol,iCol]:
              if (r<>0) then
              phi:=evalf((1/2)*arctan(2*B[iStr,iCol]/r)):
              end if:
            Сообщение отредактировано: Simon25 -
              Насколько помню, в методе Якоби ищется максимальный по модулю внедиагональный элемент. Пока он ненулевой, то тангенс угла поворота тоже ненулевой. А когда он становится нулевым повороты прекращаются.
              Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                совершенно правильно
                значит мое условие правильно?
                Сообщение отредактировано: Simon25 -
                  Скорее всего, при нулевом условии угол должен быть нулевым и ничего не повернётся, всё останется прежним. А у вас как-то обратно выходит. Надо посмотреть и избавиться от неопределённости.
                  Эх, вспоминать надо. :blush:

                  Добавлено
                  Хм, у вас прям как в вики. Ну тогда надо использовать atan2(y,x) и всё будет хорошо! ;)

                  Добавлено
                  Ой, пардон - у вас же какой-то необычный язык... ну тогда лучше всего рассмотреть два случая и вызывать arctg и arcctg в каждом.
                    это maple 17
                      Цитата Славян @
                      Хм, у вас прям как в вики. Ну тогда надо использовать atan2(y,x) и всё будет хорошо!
                      Не надо. Сам угол не нужен. Нужны тангенс и синус этого угла. Они вычисляются по значениям найденного внедиагонального элемента и соответствующих диагональных.
                      Но что помню, там на каждом цикле два раза приходится квадратный корень искать (или это когда синус и косинус используются?). Точнее, нужна функция hypot.

                      Да, неплохо было бы язык, на котором это всё написано, указать. Чтобы отвечающие могли возникающие непонятки для себя прояснить.
                      atan2 в нём скорее всего тоже есть.
                      Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script Execution time: 0,1010 ]   [ 14 queries used ]   [ Generated: 21.05.19, 20:46 GMT ]