Страницы: 1
RSS
проблема при итерации
 
всех приветствую!  
я новенький на этом форуме.  
пытался решить проблему своими силами и умственными возможностями, но "воз и ныне там" :)  
собсна, поэтому и пишу.  
 
начну издалека и плавно перейду к главному.  
с помощью excel мною была построена математическая модель работы асборбционной холодильной машины (изменение температуры и энтальпии водоаммиачного раствора описывается математическими уравнениями).  
задача данной модели - расчет цикла (прямого и обратного) при изменении исходных данных, которыми служат температура слабого раствора после генератора t2, температура конденсации t6 и температура паров аммиака после испарителя t8.  
благодаря применению циклических ссылок (читай, итераций), расчет ведется успешно, хоть и долго.  
и вот, когда пришел черед автоматизации при определении температуры слабого раствора после  регенеративного теплообменника t3 проблема и проявила себя.  
итак, суть: эта температура t3 зависит от нескольких факторов:  
1) мольной концентрации слабого раствора ψa - определена ранее опять же с помощью итерации, т.е. в данном случае выступает уже как постоянная;  
2) давления p - его и необходимо просчитать. формула для определения была проста: =если((t3-t6)>5,0001;p-0,0001;если((t3-t6)<5,0001;p+0,0001))  
и когда я клацаю enter начинается процесс обработки и через некоторое время выдается ошибка "#ДЕЛ/0!".  
загвоздка в том, что это давление р присутствует в знаменателе при определении t3.  
процесс итерации, как я понимаю, начинается с 0, а, как нам известно, на ноль делить нельзя. ну, можно, конечно, но получится бесконечность 8-)  
вопрос в следующем: что делать? :)  
вижу 2 варианта:  
1) задание области итерации, но мои поиски такой функции закончились безуспешно =( ;  
2) ваш вариант.  
 
в меню "сервис" такой вкладки как "поиск решения" у меня нет.  
есть подбор параметра, но то не то пальто :)  
 
вскользь читал, что могут использоваться возможности надстройки ВБА, если она поможет, буду осваивать.  
 
я понимаю, что поставленная задача абстрактна в своей постановке, но разрешима, если разобраться.  
для уменьшения количества возникающих вопросов прикрепляю файл с матмоделью, как того и требуют правила.
 
Имхо, у вас принципиальная ошибка в формулах типа    
=ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001))  
Когда -0.0001<=(C9-C3)<=0.0001, формула принимет значение ЛОЖЬ (или ноль), и, если она стоит в знаменателе, то и получаете #ДЕЛ/0!.  
необходимо    
=ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001);* _Чему_равно_I8_в_интевале_от_-0,0001_до_0,0001_*)  
Дальнейшее проверять слишком сложно....
 
ИМХО, 10 тыс. циклов итерации - возможно так и надо.  
Может Victtur заглянет - подскажет.  
Но для меня слишком много данных, которые не понимаю. Не смотря на то что Вы много написали - понятней не стало:((    
А может просто устал к пятнице:)
 
Да я уже давно заглянул :)  
Вывод тот же - много "ячеечек", все шустро считается, но разбираться лень (читай - не интересно). Очень много всего...
 
{quote}{login=Михаил}{date=29.01.2010 05:50}{thema=}{post}Имхо, у вас принципиальная ошибка в формулах типа    
=ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001))  
Когда -0.0001<=(C9-C3)<=0.0001, формула принимет значение ЛОЖЬ (или ноль), и, если она стоит в знаменателе, то и получаете #ДЕЛ/0!.  
необходимо    
=ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001);* _Чему_равно_I8_в_интевале_от_-0,0001_до_0,0001_*)  
Дальнейшее проверять слишком сложно....{/post}{/quote}  
Михаил, ваше замечание справедливо :)  
Я сам, когда писал формулы, столкнулся с этим. Изначально и вводил значение * _Чему_равно_I8_в_интевале_от_-0,0001_до_0,0001_* (я и щас попробовал)  
НО! выдает предупреждение:  
{quote}  
Для функции введено аргументов: Слишком много.  
 
Чтобы закрыть данное сообщение и получить справку по вводу аргументов функции, нажмите кнопку "ОК". Затем на строке формул щелкните кнопку знака равенства (слева от знака равенства в формуле)  
{/quote}  
может, тут проблема с заданной точностью при вычислениях, я проработаю это.  
 
по поводу "#ДЕЛ/0!": в формуле при определении температуры t3 давление р стоит в знаменателе.  
но, видимо, исходная точка итерации р=0, что сразу влечет за собой эту ошибку.  
меня интересует - можно как-то ее обойти?  
не зря говорят, что 2 головы лучше :)  
 
{quote}{login=Igor67}{date=29.01.2010 09:09}{thema=}{post}Но для меня слишком много данных, которые не понимаю. Не смотря на то что Вы много написали - понятней не стало:(( {/post}{/quote}  
{quote}{login=vikttur}{date=29.01.2010 09:16}{thema=}{post}много "ячеечек", все шустро считается, но разбираться лень (читай - не интересно). Очень много всего...{/post}{/quote}  
 
ребята, больше всего меня интересует трабла с определением t3. все остальное - доработки.
 
очень приятно было читать грамотно составленный вопрос)  
 
но разбираться с файлом действительно лень, единственное что могу посоветовать - это начать изучать VBA там эти задачи решаются просто.  
 
а формулы шикарные)
 
Просмотрел еще раз вопрос. Наверное, подсказать можно, только зная процесс расчета, саму математику.  
Вы проблему знаете - попробуйте смоделировать ее на небольшом примере, без сложных формул и расчетов, чтобы можно было понять саму суть.
 
{quote}{login=Dophin}{date=29.01.2010 11:38}{thema=}{post}но разбираться с файлом действительно лень, единственное что могу посоветовать - это начать изучать VBA там эти задачи решаются просто.  
 
а формулы шикарные){/post}{/quote}  
если можно будет обойтись в этом примере без применения пакета ВБА, то его изучение пока отложу. если же нет - придется осваивать, но это время =(  
да формулы самые простые - всего-то 2 логических условия "если" :)  
 
{quote}{login=vikttur}{date=29.01.2010 11:51}{thema=}{post}Наверное, подсказать можно, только зная процесс расчета, саму математику.  
Вы проблему знаете - попробуйте смоделировать ее на небольшом примере, без сложных формул и расчетов, чтобы можно было понять саму суть.{/post}{/quote}  
ок, попробую проще объяснить поставленную проблемой задачу.  
итак.  
определние точек цикла (т.4, т.2) определяется математическими уравнениями (найдены в одной зарубежной статье - достаточно согласуемы с табличными данными):  
t4=f(p0, [фи]r) - температура кр. раствора в т.4;
t2=f(pк, [фи]а) - температура сл. раствора в т.2;
давление р0 и рк заданы в начале расчета и являются постоянными.  
Допустим, как в моем примере, температура слабого раствора после генератора t2=120 oC. Соответственно, при этой температуре определенное значение имеет и мольная коцентрация [фи]а.
Главное: я не могу сразу знать какая концентрация сл. раствора, тем более с точностью до 5 знака :) поэтому и возникает необходимость применения итераций, т.е. по сути, использования метода последовательных приближений.  
Пример.  
если рк=1,169 Мпа и [фи]а=0,09187, то t2=160 oC;
если рк=1,169 Мпа и [фи]а=0,13068, то t2=150 oC;
если рк=1,169 Мпа и [фи]а=0,17147, то t2=140 oC;
если рк=1,169 Мпа и [фи]а=0,21381, то t2=130 oC;
если рк=1,169 Мпа и [фи]а=0,25749, то t2=140 oC.
все эти значения получены при ручной подстановке, которая быстро утомляет :)  
поэтому и хотел автоматизировать этот процесс, ЧТОБЫ ПУТЕМ ПОСЛЕДОВАТЕЛЬНЫХ ПРИБЛИЖЕНИЙ (ИЗМЕНЕНИЕМ В ДАННОМ ПРИМЕРЕ [фи]а) ПРИХОДИТЬ К ЗАДАННОЙ ТЕМПЕРАТУРЕ.
кое-как это получилось. хоть михаил справделиво указал на ошибку в условии "если" (см. посты выше). реализовать это исправление не получилось, поскольку появляется на экране предупреждение:  
 
Для функции введено аргументов: Слишком много.  
 
Чтобы закрыть данное сообщение и получить справку по вводу аргументов функции, нажмите кнопку "ОК". Затем на строке формул щелкните кнопку знака равенства (слева от знака равенства в формуле).  
 
теперь о проблеме при определении температуры слабого раствора после регенеративного теплообменника t3.  
в данном случае t3=f(p, [фи]а) - здесь уже [фи]а=сonst, а изменяется p.
вся проблема в том, что и давление р, и мольная концентрация [фи] присутствуют в этих математических уравнениях, данных зарубежными "коллегами" :)
но вот незадача: давление р находится в знаменателе =(  
я уже пробовал задавать начальное значение этого р при определении t3, результат - та же ошибка "ДЕЛ/0!".
 
Не пытайтесь цитировать более двух сообщений - особенность Форума.
 
вот просто нет слов - охренеть =(((  
сидел полчаса печатал-объяснял и все насмарку((  
мой напечатанный месседж уже не восстановишь? о_О  
госпола модераторы, откликнитесь!
 
Откликаюсь. Попробуйте открыть своё сообщение в режиме "Ответить с цитированием". Скопируйте там нужное, создайте новое.
 
Dophin написал:  
но разбираться с файлом действительно лень, единственное что могу посоветовать - это начать изучать VBA там эти задачи решаются просто.  
 
а формулы шикарные)  
 
если можно будет обойтись в этом примере без применения пакета ВБА, то его изучение пока отложу. если же нет - придется осваивать, но это время =(  
 
да формулы самые простые - всего-то 2 логических условия "если" :)  
 
vikttur написал:  
Наверное, подсказать можно, только зная процесс расчета, саму математику.  
Вы проблему знаете - попробуйте смоделировать ее на небольшом примере, без сложных формул и расчетов, чтобы можно было понять саму суть.  
 
ок, попробую проще объяснить поставленную проблемой задачу.  
итак.  
определние точек цикла (т.4, т.2 - как пример) определяется математическими уравнениями (найдены в одной зарубежной статье - достаточно согласуемы с табличными данными):  
t4=f(p0, [фи]r) - температура кр. раствора после абсорбера (т.4);
t2=f(pк, [фи]а) - температура сл. раствора после генератора (т.2);
давление р0 и рк заданы в начале расчета и являются постоянными.  
Допустим, как в моем примере, температура слабого раствора после генератора t2=120 oC. Соответственно, при этой температуре определенное значение имеет и мольная коцентрация [фи]а.
Согласно зависимостям (математическим уравнениям из зарубежной статьи) значения давления и мольной концентрации оказывают влияние на значение температуры, а не наоборот!  
Главное: я не могу сразу знать какая концентрация сл. раствора, тем более с точностью до 5 знака :) поэтому и возникает необходимость применения итераций, т.е. по сути, использования метода последовательных приближений.  
Пример.  
если рк=1,169 Мпа и [фи]а=0,09187, то t2=160 oC;
если рк=1,169 Мпа и [фи]а=0,13068, то t2=150 oC;
если рк=1,169 Мпа и [фи]а=0,17147, то t2=140 oC;
если рк=1,169 Мпа и [фи]а=0,21381, то t2=130 oC;
если рк=1,169 Мпа и [фи]а=0,25749, то t2=140 oC.
все эти значения получены при ручной подстановке, которая быстро утомляет :)  
поэтому и хотел автоматизировать этот процесс, ЧТОБЫ ПУТЕМ ПОСЛЕДОВАТЕЛЬНЫХ ПРИБЛИЖЕНИЙ (ИЗМЕНЕНИЕМ В ДАННОМ ПРИМЕРЕ [фи]а) ПРИХОДИТЬ К ЗАДАННОЙ ТЕМПЕРАТУРЕ.
кое-как это получилось. хоть михаил справделиво указал на ошибку в условии "если" (см. посты выше). реализовать это исправление не получилось, поскольку появляется на экране предупреждение:  
 
Для функции введено аргументов: Слишком много.  
 
Чтобы закрыть данное сообщение и получить справку по вводу аргументов функции, нажмите кнопку "ОК". Затем на строке формул щелкните кнопку знака равенства (слева от знака равенства в формуле).  
 
теперь о проблеме при определении температуры слабого раствора после регенеративного теплообменника t3.  
в данном случае t3=f(p, [фи]а) - здесь уже [фи]а=сonst, а изменяется p.
вся проблема в том, что и давление р, и мольная концентрация [фи] присутствуют в этих математических уравнениях, данных зарубежными "коллегами" :)
но вот незадача: давление р находится в знаменателе =(  
я уже пробовал задавать начальное значение этого р при определении t3, результат - та же ошибка "ДЕЛ/0!".  
 
Господа советующие, если у вас есть уточняющие вопросы, пожалуйста, задавайте!  
Я прекрасно понимаю, что мое описание проблемы для вас малопонятно, собсна, как снег на голову :)
 
В формуле =ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001);* _Чему_равно_I8_в_интевале_от_-0,0001_до_0,0001_*) я ошибся, последние скобки не там, должно быть  
=ЕСЛИ((C9-C3)>0,0001;I8+0,00001;ЕСЛИ((C9-C3)<-0,0001;I8-0,00001;* _интервал_от_-0,0001_до_0,0001_*))
 
usa10cos    
Вы снова пытаетесь объяснить нам неразумным всю химию и физику процессов.  
но химию за среднюю школу уже благополучно забыл, а самый частый "опыт" - разбавление спирта водой до получения СВС.  
 
Можно несколько проще в ячейке - значение такое.  
в другой - такое    
надо получить.  
Так нам будет проще:))
 
{quote}{login=vikttur}{date=29.01.2010 11:51}{thema=}{post}Просмотрел еще раз вопрос. Наверное, подсказать можно, только зная процесс расчета, саму математику.{/post}{/quote}  
Я этим только заметил, что без знаний не разобраться, а понять то, что Вы пытаетесь объяснить в двух словах, может только человек «в теме». Лучше выделить проблему и смоделировать ее отдельно.
 
Изменил только одну формулу в Е20; значение "5", грубо говоря, взял с "потолка"..  
Правильно считает или нет - не знаю, проверяйте.
 
Михаил, спасибо Вам за решение проблемы!  
Все верно :)  
итак,  
в ячейке I8 (мольная концентрация [фи]а) методом последовательных приближений температура t2 подбирается так, чтобы разница между заданной и полученной температурами (C9-C3) была минимальной: =ЕСЛИ((C9-C3)>0,001;I8+0,00001;ЕСЛИ((C9-C3)<-0,001;I8-0,00001;I8));
в ячейке I10 (мольная концентрация [фи]r) методом последовательных приближений температура t4 подбирается так, чтобы разница между заданной и полученной температурами (C11-C4) была минимальной: =ЕСЛИ((C11-C4)>0,001;I10+0,00001;ЕСЛИ((C11-C4)<-0,001;I10-0,00001;I10)).
 
теперь перейдем к регенеративному теплообменнику (РТО).  
итак,  
в ячейке E20 (давление сл. раствора после РТО p) методом последовательных приближений температура t3 подбирается так, чтобы разница между ней и t4 составляла 5 оС с минимальным отклонением: =ЕСЛИ(ЕОШ(ЕСЛИ((C21-C11)>5,001;E20-0,0001;ЕСЛИ((C21-C11)<4,999;E20+0,0001)));0,01;ЕСЛИ((C21-C11)>5,001;E20-0,0001;ЕСЛИ((C21-C11)<4,999;E20+0,0001;E20)));  
в ячейке E22 (давление кр. раствора после РТО p) методом последовательных приближений температура t1 подбирается так, чтобы разница между i1ф (энтальпия в т.1, полученная с помощью формул - математических уравнений из зарубежной статьи) и i1р (энтальпия в т.1, полученная из уравнения теплового баланса i1р=i4+(qт/a)) была минимальной: =ЕСЛИ(ЕОШ(ЕСЛИ((K22-B38)>0,005;E22-0,0001;ЕСЛИ((K22-B38)<-0,005;E20+0,0001)));0,01;ЕСЛИ((K22-B38)>0,005;E22-0,0001;ЕСЛИ((K22-B38)<-0,005;E22+0,0001;E22))).  
 
все остальные расчеты по определению точек цикла - аналогичны изложенным.  
 
Спасибо всем за посильную помощь.  
 
Теперь разбираюсь как правильно задавать точность расчета в формулах :)  
Поскольку нередко через этот цикл итерации, проскакивает оптимальный вариант, но  расчет показывает другой результат.
Страницы: 1
Читают тему
Наверх