На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2019 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


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,1141 ]   [ 19 queries used ]   [ Generated: 17.01.19, 19:12 GMT ]