Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422

Не работает цикл while

25.11.2019, 12:31. Показов 2370. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем привет. Формировал метод Якоби, хотел сделать вектор решений, где x_vectors[i][1] результат решения последней итерации, а x_vectors[i][0] результат предпоследней:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#Расчетная формула(x(n+1) = Bx(n)+d)
x_vectors = np.zeros((4,2))
 
 
def x_solving(x_vectors,B_arr):
    for k in range(4):
        for i in range(4):
            x_vectors[k][1] = B_arr[k][i] * x_vectors[i][0]
            x_vectors[k][1] += x_vectors[k][1]
        x_vectors[k][1] = x_vectors[k][1] + B_arr[k][4]
 
 
#Присваиваем полученные значения к 0-му столбцу(предпоследняя итерация)
def permutation(x_vectors):
    for i in range(4):
        x_vectors[i][0] = x_vectors[i][1]
 
iteration = 0
delta = 0.1
 
while delta > 0.01:
    permutation(x_vectors)
    x_solving(x_vectors,B_arr)
    delta = x_vectors[0][1] - x_vectors[0][0]
    iteration += 1
 
 
print(x_vectors)
Выводит так:

Code
1
2
3
4
[[ 0.    -1.6  ]
 [ 0.    -4.7  ]
 [ 0.     2.   ]
 [ 0.    -3.125]]
Могу предположить, что цикл while не работает так как надо. Помогите разобраться в чем ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.11.2019, 12:31
Ответы с готовыми решениями:

Почему не работает цикл for in range . То есть он не повторяет вложенный в него цикл while
import random res = 0 ore = 0 for i in range(10): while res != 3 and ore != 3: coin = random.randint(0, 1) ...

Цикл: Подскажите мне, пожалуйста, почему цикл не работает?
уважаемые программисты, подскажите мне пожалуйста почему цикл не работает for (int n = 0; n <= koll; ++n) { ...

Цикл: как работает цикл в цикле
Не могу понять как работает цикл в цикле например: repeat begin lalalala if что-то1<>100 then begin lalalala2 ...

12
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
25.11.2019, 14:20
SalavatGood, чудес не бывает.
Избавьтесь от глобалок, так вы точно ничего не отследите. И протестируйте ваши функции по отдельности.

Добавлено через 38 секунд
Да, и ещё можно использовать векторную запись numpy.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
25.11.2019, 15:07
Неправильными выглядят строки 7, 8, 9. Похоже там пытались умножить строку матрицы на вектор, а вышло совсем не то.
Python
1
2
3
        x_vectors[k][1] = 0
        for i in range(4):
            x_vectors[k][1] += B_arr[k][i] * x_vectors[i][0]
Добавлено через 8 минут
Ну и ещё. В цикле while после первой итерации delta, очевидно, равна -1.6, что меньше, чем 0.01. Возможно сравнивать надо модуль delta?
1
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 10:52  [ТС]
grizlik78, в данной функции я пытался реализовать формулу(на фото):
Python
1
2
3
4
5
6
def x_solving(x_vectors,B_arr):
    for k in range(4):
        for i in range(4):
            x_vectors[k][1] = B_arr[k][i] * x_vectors[i][0]
            x_vectors[k][1] += x_vectors[k][1]
        x_vectors[k][1] = x_vectors[k][1] + B_arr[k][4]
Миниатюры
Не работает цикл while  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.11.2019, 11:03
SalavatGood, во-первых, не надо менять значения in-place. Запутаетесь. (Это допустимо в редких случаях ради быстродействия, тут не тот случай.)
Во-вторых, почему бы не использовать векторную запись? Похоже на обычное матричное произведение.
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 11:12  [ТС]
grizlik78, матрица x_vectors это вектор решений, где(как бы мне хотелось) 0-й столбец результат иксов предпоследней итерации, а 1-й столбец иксы последней итерации. Такая матрица мне как раз нужна, чтобы вычислить значение delta(максимальное значение/разница разности между иксами последней и предпоследней итерации). И delta сама же и является условием выхода из цикла, поскольку как только delta станет, допустим, < 0.01, то необходимая точность как раз таки будет достигнута. Задача вроде бы вполне легкая, но мне кажется, что мне знаний где-то не хватает, по скольку у меня когда я ввожу функции решения уравнения и перестановок столбцов(x_solving, permutation) в цикл while, у меня напрочь отказывается все работать как надо...

Добавлено через 2 минуты
dondublon, матрицы тут не причем, я умножаю между собой элементы матриц с которыми работаю
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.11.2019, 11:21
SalavatGood, даже если не произведение - векторное (в смысле numpy) умножение налицо.
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 11:30  [ТС]
dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
даже если не произведение - векторное (в смысле numpy) умножение налицо
не могу понять что это меняет, и вы имели в виду элементы в одну строку записать?
Цитата Сообщение от dondublon Посмотреть сообщение
ещё можно использовать векторную запись numpy
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.11.2019, 12:06
SalavatGood, именно.

Добавлено через 47 секунд
И там, кстати, есть специальная функция inner для скалярного произведения.
1
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 12:18  [ТС]
dondublon, спасибо и вот еще я применил модуль для delta, но у меня функция перестановки(permutation) не корректно работает в цикле while:
Python
1
2
3
4
5
while delta > 0.00001:
    permutation(x_vectors)
    x_solving(x_vectors,B_arr)
    delta = abs(x_vectors[0][1] - x_vectors[0][0])
    iteration += 1
Вывод:
Code
1
2
3
4
[[-0.35       -0.35      ]
 [-7.2        -7.2       ]
 [-0.67857143 -0.67857143]
 [-3.125      -3.125     ]]
Мне же надо, чтобы в нулевом столбце значения предыдущей итерации были, а он оба столбца одинаковыми делает

Вот функция перестановки, кстати:
Python
1
2
3
4
#Присваиваем полученные значения к 0-му столбцу(предпоследняя итерация)
def permutation(x_vectors):
    for i in range(4):
        x_vectors[i][0] = x_vectors[i][1]
Хотя по сути, он же не должен последние иксы вообще трогать...
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.11.2019, 12:47
SalavatGood, во-первых, напоминаю - по возможности, не надо менять in-place.
Во-вторых, в numpy это делается так:
Python
1
x_vectors[:, 0]=x_vectors[:, 1]
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
06.12.2019, 12:21  [ТС]
dondublon, я сам неправильно реализовал функцию permutation(не те столбцы присвоил), однако просто присвоение столбцов чуть чуть по другому сделал и все заработало:
Python
1
2
3
def permutation(x_vectors):
    for i in range(x_vectors.shape[0]):
        x_vectors[i][1] = x_vectors[i][0]
Ваш метод получше и дает такой же результат, но я не совсем понимаю, что это меняет, и что значит in-place:
Python
1
2
def permutation(x_vectors):
    x_vectors[:, 1] = x_vectors[:, 0]
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.12.2019, 13:24
SalavatGood, во-первых, в моём варианте используется векторность numpy.
Во-вторых, in-place - меняем прямо на месте, в противоположность подходу, когда старую переменную не меняем, а для результата создаём новую. Это в итоге проще для понимания.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2019, 13:24
Помогаю со студенческими работами здесь

Нерабочий цикл. Я не понимаю почему он не работает. Я выделил нерабочий цикл пометками. Знает ли кто то причину?
uses GraphABC,ABCObjects; var i,xHead,yHead,z,appleX,appleY:integer; head,apple:CircleABC; score:TextABC; snake:array of...

Почему цикл for (java script) не работает в браузерах от гугла, яндекса, но работает в IE
Подскажите почему цикл for не выполняется в браузерах от гугла и хром, но выполняется в IE: изучая java script решил попробовать сделать...

На Главной странице не работает правильно вывод (неккоректно работает цикл)
Я создал тему с нуля. И мне нужно было чтоб на главной странице(Главная) http://www.wnero.esy.es/home/ и при заходе на сайт по...

Почему не работает цикл for in range . То есть for in range не повторяет вложенный в него цикл while
import random res = 0 ore = 0 for i in range(10): while res != 3 and ore != 3: coin = random.randint(0, 1) ...

Цикл работает неправильно, в то время как POST работает
Всем привет! Я хотел написать под php скрипт с авторизацией, брут, на своем сайте(подбор пароля). Написал код на загрузку словаря +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru