Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2020, 14:16   #1
Denny777
Новичок
Джуниор
 
Регистрация: 24.05.2020
Сообщений: 5
По умолчанию Не могу придумать цикл

Здравствуйте. Меня что-то заклинило, не могу составить простой цикл.
Дано: Предположим дано уравнение вида a+b=x, где a - какое-то постоянное число, b - перебираются значения в каком-то диапазоне с некоторым шагом, x - корень.
Задача: Нужно перебирать значения b до тех пор, пока не будут получены подряд два значения x с разными знаками.
Помогите, пожалуйста.
Denny777 вне форума Ответить с цитированием
Старый 24.05.2020, 15:35   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
x - корень.
Корень чего или из чего??
Если b = -a и шаг h, то a + b + h/2 - положительное, а a + b - h/2 - отрицательное.
И так, у нас есть некоторое a.
Выбираем h, например, 0.000002.
Тогда b = - a - h/2 и:
x0 = a + b - отрицательное, а x1 = a + b + h - положительное.

Цитата:
будут получены подряд два значения x с разными знаками
Можно как то более внятно объяснять что хотите получить?
Язык, начальные значения, условие преобразования, условие завершения.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.05.2020, 16:23   #3
Denny777
Новичок
Джуниор
 
Регистрация: 24.05.2020
Сообщений: 5
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Корень чего или из чего??
Не правильно выразился, x - это решение выражения a+b


Цитата:
Сообщение от ViktorR Посмотреть сообщение
Можно как то более внятно объяснять что хотите получить?
Язык, начальные значения, условие преобразования, условие завершения.
Язык C++. Смотрите, суть не в том, каким образом b перебирается. А в том, что:

1) мы посчитали один раз a+b, получили значение x.
2) b у нас как-то изменился (не важно как)
3) мы опять посчитали a+b, получили другое значение x
4) b опять изменился

И так до тех пор, пока два подряд значения x не будут с разными знаками.
Я туплю и не понимаю, как сделать цикл. Чтобы сравнивать текущее значение х с предыдущим.
Denny777 вне форума Ответить с цитированием
Старый 24.05.2020, 17:51   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
2) b у нас как-то изменился (не важно как)
Смотрим пример:
a = 5
b = 0
шаг h = 1
т.е. bi = bi-1+h
Цитата:
И так до тех пор, пока два подряд значения x не будут с разными знаками.
А вот никогда. И??
Для любых, а не конкретных значений и типа "неважно как" вы получите
Ну в общем сами понимаете.
Есть задача: есть исходные данные, есть условие, могут быть дополнительные правила ...
В принципе:
Код:
do {
   ...
}while <условие>;
может вам помочь.
Или
Код:
while 1{
   ...
   if <условие> break;
   ...}
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.05.2020, 19:07   #5
Denny777
Новичок
Джуниор
 
Регистрация: 24.05.2020
Сообщений: 5
По умолчанию

Вот более конкретный пример.

Дано: 27*(86-46*cos(a))=x, где a - меняется от 0 до pi с шагом pi/6
Задача: Нужно перебирать значения a до тех пор, пока не будут получены подряд два значения x с разными знаками.

Я не понимаю как составить цикл так, чтобы на каждой итерации фиксировать значение x, сохранять его до прохождения следующей итерации, фиксировать новое значение и сравнивать его с предыдущим. И так до выполнения условия задачи.

Код:
for (double a = 0; a = pi; a + pi / 6)
{
 double x;
 x = 27*(86-46*cos(a));
}
Denny777 вне форума Ответить с цитированием
Старый 24.05.2020, 19:45   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

1.Более привычно глазу, когда независимая и зависимая переменные обозначаются традиционно:
Код:
y = 27*(86-46*cos(x))
2. Какой-то куцый обрезок задачи вычисления корня. В нормальном методе, поймав интервал локализации, сужаем его (дихотомией, хордами, касательными) до приемлемой точности. Так что будем считать задачу первой частью поиска корня. А решается оно просто, как двумя пальцами об асфальт:
а - Вычисляем значение на границе интервала, запоминаем.
б - Прибавляем шаг, вычисляем значение.
в - Если знак другой - задача решена. Если нет
г - Если дошли до конца интервала, а оно - никак - решения нет, иначе запоминаем значение -- и на п. б
Шаг великоват pi/6, проскочить можем. Чай не на арифмометре Феликс считаем, компутеру эта задачка - на пару микросекунд.
3. Со сравнениями действ. чисел на равенство очень осторожно надо быть, можем улететь хр.з.к. Надо бы
Код:
a <= pi;
4. А вообще задачка бредовая, писанная пьяным сантехником.
Косинус всегда <=1, умножить на 46 всегда <=46. Интересно - откуда тут минус проклюнется ?

Последний раз редактировалось digitalis; 24.05.2020 в 20:02.
digitalis вне форума Ответить с цитированием
Старый 24.05.2020, 20:09   #7
Denny777
Новичок
Джуниор
 
Регистрация: 24.05.2020
Сообщений: 5
По умолчанию

digitalis, вы правы, задача дурацкая. Я попытался для примера её привести, чтобы реальное уравнение не переписывать. Оно большое очень, из нескольких этапов вычисляется. И да, вы опять правы, это первая часть задачи. Вторая часть уточнение задачи методом бисекции. Мне нужно просто алгоритм понять.
Denny777 вне форума Ответить с цитированием
Старый 24.05.2020, 20:18   #8
Denny777
Новичок
Джуниор
 
Регистрация: 24.05.2020
Сообщений: 5
По умолчанию

digitalis, т.е. если использовать мой дурацкий пример, то получится как-то так?

Код:
double x, y, y_2;

for (double x = 0; x = pi; )
{
 y = 27*(86-46*cos(x));
 x = x + pi/6;
 y_2 = 27*(86-46*cos(x));
 if (y*y_2 < 0)
 {
   break;
 }
}

Последний раз редактировалось Denny777; 25.05.2020 в 00:02.
Denny777 вне форума Ответить с цитированием
Старый 24.05.2020, 21:23   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Чтобы 2 раза не пересчитывать на каждом шаге:
Код:
double x = 0, y1, y2;
y1 = 27 * (86 - 46 * cos(0));

for (x = pi / 6; x <= pi; x += pi / 6) {
    y2 = 27 * (86 - 46 * cos(x));
    if (y1 * y2 < 0)
        break;
    y1 = y2;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.05.2020, 21:31   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Можно так.
Описать переменную-флаг и инициализировать её значением False.
Код:
bool flag = False;
Код:
В цикле
{
    <вычислить значение>;  // Вычисление текущего значения
    if ((<значение> < 0) & (<флаг>)) break; // Нашли решение
    if (<значение> < 0)        // претендент
        flag = True
    else                              // Придётся подождать
        flag = False;
    inc(<переменная>);       // Изменение переменной на шаг
}
PS: Я не знаю Си, так что это только соображения.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Головоломка Птички. Не могу придумать авторешение Armageddets Общие вопросы Delphi 2 11.05.2018 13:24
не могу придумать условие запроса Dvoishnik SQL, базы данных 3 22.04.2016 15:31
Не могу придумать доработку. Rik55rus Помощь студентам 1 06.10.2012 21:13
не могу придумать форрмулу!!! ta4ilka Microsoft Office Excel 3 11.04.2010 18:02