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

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

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

Author24 — интернет-сервис помощи студентам
Всем привет. Формировал метод Якоби, хотел сделать вектор решений, где 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)
Выводит так:

Код
[[ 0.    -1.6  ]
 [ 0.    -4.7  ]
 [ 0.     2.   ]
 [ 0.    -3.125]]
Могу предположить, что цикл while не работает так как надо. Помогите разобраться в чем ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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: ...

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

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

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

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

Добавлено через 38 секунд
Да, и ещё можно использовать векторную запись numpy.
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
25.11.2019, 15:07 3
Неправильными выглядят строки 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  [ТС] 4
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
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
26.11.2019, 11:03 5
SalavatGood, во-первых, не надо менять значения in-place. Запутаетесь. (Это допустимо в редких случаях ради быстродействия, тут не тот случай.)
Во-вторых, почему бы не использовать векторную запись? Похоже на обычное матричное произведение.
0
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 11:12  [ТС] 6
grizlik78, матрица x_vectors это вектор решений, где(как бы мне хотелось) 0-й столбец результат иксов предпоследней итерации, а 1-й столбец иксы последней итерации. Такая матрица мне как раз нужна, чтобы вычислить значение delta(максимальное значение/разница разности между иксами последней и предпоследней итерации). И delta сама же и является условием выхода из цикла, поскольку как только delta станет, допустим, < 0.01, то необходимая точность как раз таки будет достигнута. Задача вроде бы вполне легкая, но мне кажется, что мне знаний где-то не хватает, по скольку у меня когда я ввожу функции решения уравнения и перестановок столбцов(x_solving, permutation) в цикл while, у меня напрочь отказывается все работать как надо...

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

Добавлено через 47 секунд
И там, кстати, есть специальная функция inner для скалярного произведения.
1
14 / 13 / 1
Регистрация: 18.12.2018
Сообщений: 422
26.11.2019, 12:18  [ТС] 10
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
Вывод:
Код
[[-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
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
26.11.2019, 12:47 11
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  [ТС] 12
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
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
06.12.2019, 13:24 13
SalavatGood, во-первых, в моём варианте используется векторность numpy.
Во-вторых, in-place - меняем прямо на месте, в противоположность подходу, когда старую переменную не меняем, а для результата создаём новую. Это в итоге проще для понимания.
1
06.12.2019, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2019, 13:24
Помогаю со студенческими работами здесь

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

На Главной странице не работает правильно вывод (неккоректно работает цикл)
Я создал тему с нуля. И мне нужно было чтоб на главной странице(Главная)...

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

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

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Не работает цикл
Подскажите, почему не работает цикл по условию? Делаю все как наисано в книге. У меня должны...

Нк работает цикл
program zadanie25; const n = 4; var a: array of integer; i, j, k:integer; begin for...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru