Разработка программы для определения поглощаемого теплового излучения, падающего на произвольно ориентированную площадку, в стратосфере Земли

Методика определения среднего значения интенсивности солнечного излучения на границе атмосферы Земли. Характеристика основных компонентов графического интерфейса программного приложения. Алгоритм вычисления освещенности наклонной приемной площадки.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2018
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Введение

Солнце - единственная звезда Солнечной системы. Она имеет температуру на поверхности около 5780 К. Солнце излучает свет необходимый для фотосинтеза, т.е. является одним из факторов обеспечивающих жизнь на Земле.

В настоящее время все большую значимость приобретают вопросы энергетики и экологии. Запасы нефти и угля не бесконечны, к тому же энергия вырабатывается при горении топлива, а данный процесс сопровождается выбросом в атмосферу токсичных веществ и канцерогенов. Вследствие этого человечество задумалось о различных альтернативных источниках энергии. Например, чтобы избавиться от выхлопных газов, люди начали использовать электрические транспортные средства. Но для работы электродвигателей нужна электроэнергия, а большая ее часть получается при сжигании топлива. Одним из способов решения энергетической проблемы является применение солнечных батарей.

Как известно, топливо используются не только для автомобилей, но и в авиации. Поэтому появляются достаточно смелые проекты по созданию самолетов, использующих исключительно солнечную энергию. Что уже говорить про более легкие воздушные суда, например, аэростаты.

В виду вышесказанного, использование солнечных панелей в сверхлегкой (малой) авиации является перспективным и может скоро стать повсеместным.

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

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

Рассмотрим летательный аппарат (ЛА), на примере стратостата, находящегося в стратосфере Земли, т.е. на высоте от 11 до 50 км над уровнем моря. На обшивку рассматриваемого ЛА, поступает тепловое излучение. Для того чтобы вычислить суммарное тепловое излучение, поступающее на корпус стратостата, необходимо аппроксимировать обшивку элементарными приемными площадками. По месту нахождения приемные площадки можно разделить на два типа: расположенные на верхней части ЛА и расположенные в нижней части. На приемную площадку в верхней части действует прямое солнечное излучение (СИ), рассеянное верхними слоями атмосферы рассеянное СИ, а так же инфракрасное (ИК) излучение самой атмосферы. На расположенную внизу приемную площадку попадает отраженное СИ и СИ, рассеянное нижними слоями атмосферы, а так же ИК излучение Земли и окружающей атмосферы. Ниже приведено схематическое изображения поставленной задачи.

Рис. 1

1. Теоретическая часть

Энергия солнечного излучения.

Солнечное излучение считается тепловым. В космическом пространстве данному излучению ничто не препятствует, однако в среде это не так. Часть исходного излучения поглощается и рассеивается атмосферой. При этом часть поглощенного солнечного излучения атмосфера затем излучает на поверхность земли, а часть обратно в космос. Излучение, полученное приёмной площадкой от молекул воздуха, называется диффузным или рассеянным. Рассеяние света происходит благодаря неоднородностям среды, например из-за флуктуаций плотности воздуха, наличия облаков, аэрозолей или пыли. Кроме атмосферы солнечную радиацию отражает и поверхность земли. Данную часть радиации называют отраженной. Интенсивность солнечного излучения, падающего на приемную площадку, складывается из интенсивности прямого, диффузного и отраженного от земли излучения[1]:

(1.1)

Солнечная постоянная.

Среднее значение интенсивности солнечного излучения на границе атмосферы - солнечная постоянная - принимается равным Вт/м2. Так как при движении по орбите расстояние между Землей и Солнцем изменяется, интенсивность излучения, поступающую на границу атмосферы, зависит от времени [2]:

(1.2)

где - усредненный радиус орбиты, принимаемый 149,6 млн. км, а - текущий, изменяющейся в диапазоне от 147,5 до 152,5 млн. км.

Выведем формулу для r(t). Земли движется вокруг Солнца по эллиптической орбите. Большая полуось a равна 149,59826 млн.км, а малая полуось b - 149,57624 млн.км. Так же следует отметить, что Солнце смещено от центра эллипса. Введем систему координат, связанную с центром, так что Солнце будет лежать в отрицательной области по оси x и в нуле по y.

Запишем уравнение вышеописанного эллипса:

(1.3)

Земля находится ближе всего к Солнцу (перигелий) в период от 3 до 5 января, а максимально удаляется (афелий) в период от 3 до 7 июля. Чтобы вычислить , отнимем от 149,598 минимальное расстояние 147,098, тогда уравнение 1.3 примет вид:

(1.4)

Для удобства вычислений введем полярную систему координат, где радиус r обозначает расстояние от Солнца до Земли, а угол зависит от даты. Так как минимальный угол со значением наблюдается в перигелии, который мы примем за 4 января, то значение угла ц в зависимости от номера дня в году n можно получить, используя выражение . Вариации угловой скорости движения Земли по орбите не учитываются.

(1.5)

Подставив систему 1.5 в выражение 1.4 получим квадратное уравнение . Решая которое, получаем искомую зависимость r(t). Стоит отметить, что в силу физического смысла задачи нас интересуют только положительные r. Результаты расчетов по приведенной выше методике отражены на рис. 2.

Рис. 2. Изменение расстояние от Земли до Солнца в зависимости от дня в году

Теперь можно рассчитать , результаты приведены на рис. 3.

Рис. 3. Зависимость солнечной постоянной от дня в году

Отсюда видно, что летом меньше солнечной постоянной, а зимой наоборот больше.

Закон Бугера.

Стоит отметить, что атмосфера пропускает не всё солнечное излучение, поэтому применим закон Бугера[2], который позволяет рассчитать интенсивность излучения, прошедшего через участок некоторой среды:

(1.6)

здесь - интенсивность на входе в атмосферу, I - интенсивность на выходе, - коэффициент пропускания рассматриваемого участка среды.

Зная солнечную постоянную и коэффициент прозрачности атмосферы, можно найти интенсивность солнечного излучения, падающего на приемную площадку:

(1.7)

здесь p коэффициент прозрачности атмосферы, m - оптическая масса слоя атмосферы над приемной площадкой. Она равна отношению массы воздуха M в прямом цилиндре единичной площади сечения, ось которого совпадает с траекторией лучей от границы атмосферы до приемной площадки, к массе воздуха M0 в аналогичном цилиндре при нахождении солнца в зените, а площадки на поверхности Земли.

(1.8)

Одним из способов приближенного вычисления оптической массы является представление атмосферы как плоского слоя. Тогда m можно вычислить по формуле

, (1.9)

где - высота однородной атмосферы примерно равная 8 км, h - угловая высота Солнца над горизонтом. H - высота однородной атмосферы над уровнем, на котором находится площадка. Она вычисляется по формуле , где - плотность воздуха при нормальных условиях, давление p и ускорение свободного падения можно взять либо из таблицы значений в зависимости от высоты z, либо получить с помощью барометрической формулы[2]:

(1.10)

Молярная масса воздуха , R = 8,314Дж/(моль*К) - универсальная газовая постоянная, T - температура, которая на высоте от 11 км до 20 км примерно равна -216 К. Затем температура постепенно увеличивается и на высоте 47 км устанавливается снова постоянное значение, приблизительно равное 270 К.

Ламберт вывел более точную формулу для вычисления оптической массы:

(1.11)

где r - радиус Земли, равный 6371 км.

Ускорение свободного падения в зависимости от высоты тоже достаточно просто вычисляется[7]:

(1.12)

где - гравитационная постоянная, радиус и масса Земли соответственно.

Для учета степени прозрачности атмосферы при вычислении интенсивности прямого солнечного излучения допускается использовать эмпирическую формулу Кастрова [2]:

(1.13)

где с - описывает степень прозрачности.

Таблица 1.1. Коэффициент прозрачности

Прозрачность

Очень низкая

Низкая

пониженная

нормальная

повышенная

с

0,91

0,67

0,54

0,43

0,34

Положение Солнца.

Расположение Солнца относительно некоторой точки на Земле принято описывать с помощью двух углов. Первый из них - это азимут a - угол между направлением на юг и проекцией солнечного луча на горизонтальную плоскость, второй угол h характеризует высоту Солнца. Местоположение самой точки описывается с помощью -широты и -долготы, измеряемых в градусах.

Рис. 4. Положение Солнца

Количество солнечной радиации падающей на некоторую элементарную площадку, расположенную на земле, зависит от времени суток, года и расположения самой площадки.

Когда Солнце находиться в зените, т.е. на максимальной высоте, солнечные лучи проходят в атмосфере самый короткий путь, следовательно, до поверхности Земли доходит самое большое количество солнечной энергии.

Рис. 5

Данная зависимость между временем суток и углом, под которым падает СИ, описывается часовым углом. Часовой угол - это угол, на который Солнце отклонилось от полуденного положения. Полднем принято считать 12 часов дня, но часовые пояса, во-первых, не обладают достаточной точностью, а, во-вторых, вводятся зачастую не из географических соображений, а скорее геополитических. Например, две соседних области объединяют в один часовой пояс. Поэтому время полдня требуется уточнить, для этого применяется конструкция 4мин.*. Карта общепринятых в настоящее время часовых поясов приведена на Рис. 6

Рис. 6. Часовые пояса

С учетом сезонных изменений сдвиг рассчитывается по формуле:

(1.14)

где ,а n - номер дня в году. Результаты расчетов E(n) приведены на рис. 7.

Рис. 7. Уравнение времени

Теперь можно записать итоговую формулу для часового угла:

(1.15)

- долгота текущего часового пояса, время в нем рассчитывается по формуле t = (UTC+), UTC - всемирное координированное, или согласованное время, 15о это угол, на который земля поворачивается за час вокруг своей оси, t-текущее время, а c помощью выражения можно посчитать время наступления полудня в данной местности.

Кроме часового угла следует учитывать широту расположения площадки. Чем дальше от экватора находится горизонтальная приёмная площадка, тем больший угол (в среднем) образуется между нормалью к ней и падающим солнечным излучением, при этом солнечные лучи проходят больший путь в атмосфере.

Ось Земли имеет наклон, поэтому, когда Земля находится на орбите таким образом, что под максимальным углом к поверхности падают лучи на Северном полушарии, а под минимальным на Южном то мы наблюдаем в Северном полушарии зиму, а в Южном лето. Когда же Земля переместится по орбите на пол оборота, то в Южном полушарии наступит зима.

Рис. 8

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

(1.16)

Теперь, зная угол склонения Солнца и часовой угол, можно записать выражение для расчета высоты Солнца:

(1.17)

и для азимута:

(1.18)

Произвольно ориентированная площадка.

Теперь рассмотрим произвольно расположенную площадку, для этого введем два угла, характеризующие положение площадки в пространстве. Это - угол между меридианом и горизонтальной составляющей нормали и -наклон площадки[1].

Рис. 9. Ориентация приемной площадки

Величина поток прямого солнечного излучения, падающего на произвольно ориентированную единичную площадку:

(1.19)

где - угол падения солнечного излучения.

(1.20)

Подставив в данную формулу выражения для высоты и азимута, получим итоговую формулу.

Рассеянная солнечная радиация.

Как упоминалось выше, при прохождении сквозь атмосферу часть от первоначального прямого СИ поглощается, а часть рассеивается. Потеря прямой солнечной радиации при прохождении пути до приёмной площадки, расположенной на высоте z, равна , где - интенсивность прямой солнечной радиации на высоте z.

Если считать индикатрису рассеяния СИ симметричной относительно плоскости, перпендикулярной лучам, то половина излучения направлена вниз к поверхности земли, а вторая вверх, и итоговая формула для рассеянной солнечной радиации, падающей на горизонтальную площадку сверху, имеет вид [2]:

(1.21)

Для идеальной атмосферы , но более реалистичным является значение . Формула 1.21 для наклонной приемной площадки должна быть дополнена с учетом до вида:

(1.22)

СИ рассеивается не только в слоях атмосферы над приемной площадкой, но и в слоях находящихся ниже. Поэтому запишем формулу для учета рассеянной радиации приходящей на площадку из нижних слоев атмосферы.

(1.23)

где - поток прямого солнечного излучения, доходящего до поверхности Земли.

Отраженная радиация.

Прямая и рассеянная радиация, не попавшая на приемную площадку, падает на облака и поверхность Земли, которые, как известно, имеют некоторую отражательную способность. Стоит отметить, что такое отражение является диффузным. Коэффициент диффузного отражения называется альбедо. Запишем формулу для определения отраженной радиации, падающей на наклонную приемную площадку:

(1.24)

В формуле 1.24 - альбедо подстилающей поверхности или облаков. и вычисляются для высоты, на которой находиться отражающая СИ поверхность, r - высота площадки над отражающей поверхностью.

Подстилающая поверхность может быть неоднородна. В частности, приемная площадка может располагаться над границей между степью и лесным массивом. В таких случаях вычисляется среднее альбедо ,где - альбедо для данного типа подстилающей поверхности, а - доля площади с альбедо от общей площади. Значения альбедо для некоторых подстилающих поверхностей приведены в таблице 1.2. [4]

Таблица 1.2. Альбедо подстилающих поверхностей

Поверхность

Альбедо

Поверхность

Альбедо

Чернозем сухой

0,14

Песок желтый

0,35

Снег (умерен. широты)

0,70

Зеленая трава

0,26

Тундра, степи

0,18

Вершины елей

0,10

Пустыня

0,30

Морской лед

0,36

Таблица 1.3. Альбедо облаков

Форма облаков

Альбедо

Кучево-дождевые

0,86

Кучевые облака хорошей погоды над сушей, более 8 баллов

0,29

Слоисто-кучевые над сушей, более 8 баллов

0,68

Слоисто-кучевые, сплошной массив над океаном

0,60

Слоистые облака, просвечивающие, над океаном

0,42

Перисто-слоистые облака, плотные

0,74

Перистые облака над сушей

0,36

Перисто-слоистые облака над сушей

0,32

Суммарная освещенность площадки солнечным излучением

Суммарный поток солнечной радиации Q, приходящий сверху на наклонную площадку, с учетом облачности вычисляется по формуле 1.25 [4].

(1.25)

где - эмпирический коэффициент, зависящий от широты, некоторые значения приведены в таблице 1.4, - коэффициент облачности выше z. Коэффициент облачности отражает долю покрытия некоторой площади облаками, и имеет значения 1 в случае в случае 10 бальной облачности и 0 в случае полного отсутствия облаков.

Таблица 1.4

ц

0

10

20

30

40

50

60

70

75

80

85

0,38

0,40

0,37

0,36

0,38

0,40

0,36

0,18

0,16

0,15

0,14

Итоговая формула для суммарного потока СИ, приходящего снизу на единичную приемную площадку:

(1.26)

В данной формуле и - потоки СИ, отраженного от поверхности Земли и от облаков соответственно, -коэффициент облачности, отражающий количество облаков, находящихся ниже высоты z, а - коэффициент общей облачности.

Излучение Земли и Атмосферы.

Энергия, излучаемая Землей, приходится на ИК-спектр (4 - 120 мкм). Земная поверхность близка по оптическим свойствам к абсолютно черному телу, однако им не является. Поэтому при записи закона Стефана-Больцмана необходимо учитывать коэффициент поглощения, который можно выразить через коэффициент отражения, тогда формула для плотности потока излучения земной поверхности примет вид [4]:

(1.27)

Здесь - постоянная Стефана-Больцмана, а - температуру поверхности Земли, среднее значение которой 287 К, - альбедо подстилающей поверхности в ИК диапазоне, которое близко к нулю, например, для песка равно 0,05, для травы или хвойного леса 0,03, для свежего снега 0,014, а не территории Великобритании вообще принимает нулевое значение.[3]

Если мы рассматриваем излучение Земли на некоторой высоте z , то следует учесть коэффициент пропускания атмосферы , где - отношение давления вычисленного по барометрической формуле для высоты z к давлению на поверхности.

Теперь рассмотрим излучение атмосферы , где - температура на высоте z, - излучающая способность, зависящая главным образом от содержания водяных паров в атмосфере.

Запишем эмпирическую формулу для теплового излучения атмосферы.

(1.28)

графический программный интерфейс солнечный

- давление водяного пара на высоте z в гПа.

Итоговая формула для освещенности наклонной приемной площадки примет вид ИК излучением примет вид[5]:

(1.29)

Поглощение. Для того, что бы определить поглощаемое тепловое излучения необходимо знать площадь приёмной площадки , а так же коэффициенты поглощения. Пусть - коэффициент поглощения в длинноволновой области спектра.

(1.30)

Кроме того, зная температуру приемной площадки можно записать уравнение теплового баланса в ИК спектре:

(1.31)

Для солнечного излучения соответствующая формула имеет вид

(1.32)

где - соответствующий коэффициент поглощения.

2. Практическая часть

Программная реализация.

Для проведения численных расчетов по описанной в теоретической части методики, была составлена программа состоящая из следующих модулей:

· integral

· radius

· time1

· solar

· widget

В подпрограмме integral вычисляется давление на высоте z по барометрической формуле (). Для интегрирования применяется метод Симпсон. Данный метод выбран, потому что достаточно просто реализуется, и при этом является более точным, чем методы прямоугольников и трапеции.[6]

Сначала необходимо разбить область интернирования точками с некоторым шагом , причем, чем меньше , тем точнее результат. После того, как задана сетка интегрирования, можно записать итоговую формулу для метода Симпсона:

Подпрограмма radius вычисляет значение плотности потока солнечного излучения , поступающего на границу атмосферы, в зависимости от номера дня в году, по описанному в теоретической части алгоритму.

Подпрорамма time1 содержит класс My_Time, который обеспечивает возможность работы со времен в привычном виде и позволяет совершать алгебраические операции необходимые для реализации вычисления часового угла.

Основная часть вычислений производится в подпрограмме solar. Именно в ней прописан весь алгоритм вычисления поглощаемого наклонной площадкой потока теплового излучения.

Подпрограмма widget обеспечивает работу графического интерфейса, здесь описана реакция кнопок в интерфейсе программы, осуществляется обработка входных данных, вызов функций из подпрограммы solar и печать результатов их работы. Тут например градусы переводятся в кельвины, а в функции n_wr() дата введенная в формате дд.мм.гггг переводится в номер дня в году и т.д.

Интерфейс программы

Программа имеет простой графический интерфейс. В левой половине содержится поля ввода данных, а справой поле вывода результатов. Для выполнения программы достаточно нажать кнопку «решить» или же обновить какое либо из входных значений.

Поле ввода параметров содержит три вкладки. Первая называется «Дата/Место» рис. 10, в ней вводится Время суток, часовой пояс, дата, а так же координаты расположения приемной площадки, необходимые для расчета часового угла и угла склонения. Благодаря этим двум углам вычисляются высота солнца и азимут, значение которых выводится первой строчкой в поле с результатами. Кроме того в первой вкладке так же можно ввести температуру поверхности Земли, которая используется для расчета потока ИК излучения Земли, и свойства подстилающей поверхности. Альбедо можно ввести двумя способами, выбрав необходимый тип подстилающее поверхности или же вручную введя коэффициент, для чего в список подстилающих поверхностей нужно выбрать «Ручной ввод».

Рис. 10. Вкладка 1

Вторая вкладка «Площадка» содержит поля ввода всех параметров площадки. В поле «поглощение» вводятся коэффициенты поглощения площадки в длинноволновой и коротковолновой области спектра. Так как поставлена задача расчета поглощенного тепла произвольно ориентированной площадкой, то в поле «наклон» задаются углы, характеризующие направление нормали площадки, В полях «Площадь», «Температура» - площадь и температура соответственно, а в поле «высота» вводится высота над уровнем моря, которая для Стратосферы может принимать значения от 11 км до 50 км.

Рис. 11. Вкладка 2

Вкладка «Атмосфера» содержит параметры атмосферы и облачности.

Рис. 12. Вкладка 3

Результаты работы.

С использованием выше описанной программы были произведены некоторые расчеты. Координаты и часовой пояс были установлены в соответствии с координатами Москвы.

На рис. 13 отраженны результаты освещенности приемной площадки прямой и рассеянной сверху солнечной радиацией в зависимости от времени суток для 31 мая. Синим цветом отображено прямое СИ, а красным рассеянное. Графики построены с шагом 5 км начиная с нулевой высоты над уровнем моря и заканчивая 50 км, что соответствует верхней границе стратосферы, углы и равны нулю. С высотой компонента прямого СИ растет, а рассеянного уменьшается. Начиная с высоты 20 км освещенность прямым и рассеянным СИ практический перестает меняться, при этом, компонента рассеянной радиации становится пренебрежительно маленькой по сравнению с прямой.

Рис. 13. Освещенность прямым и рассеянным СИ горизонтальной площадки

На рис. 14. отображена освещенность прямой солнечной радиации горизонтальной приемной площадки для разных высот z (11, 15, 20, 25, 30,40,45 км) в сравнении с

Рис. 14

Для того же дня и местности в момент времени равный ровно 14 часам при полете ЛА над песчаной местностью в безоблачную погоду и высотой полета равной 20 км построена зависимость освещенности приемной площадки отраженным и нисходящим рассеянным солнечным излучением от угла рис. 15, а так же прямым СИ рис. 16.

Рис. 15. Зависимость отраженной (синий) и рассеянной (красный) солнечной радиации от угла

Рис. 16. Зависимость прямой солнечной радиации от угла

А при максимальном , такая же зависимость то угла

Рис. 17. Зависимость прямой солнечной радиации от угла

Заключение

С помощью написанного программного обеспечения в ходе выполнения данной работы, можно проводить анализ, необходимый при проектировании летательных аппаратов на солнечных энергетических установках. Оценивать количество тепла поступающего на обшивку летательного аппарата; рассчитывать оптимальное местоположения и общую площадь солнечных элементов, а также подобрать материалы с наиболее подходящими характеристиками теплопоглощения.

В результате было выявлено, что освещенность солнечной радиацией верхнюю часть аппарата находящегося в стратосфере очень большая, что доказывает целесообразность использование солнечной энергии. В северном полушарии максимальное количество энергии поглощается не горизонтальной приемной площадкой, а наклоненной к горизонту, причем в январе над Москвой оптимальный угол оказался равен примерно 80о , а летом около 30о , однако в любом случае при таких значениях угла наклона к горизонту большое влияние оказывает ИК излучение Земли и отраженная солнечная радиация, особенно при полетах над заснеженными участками или облаками. Самая большая освещенность ИК излучением у приемной площадки расположенной в нижней части ЛА, параллельно Земле, при этом освещенность СИ там мала, из чего можно сделать вывод, что для нижней части судна целесообразно использовать материалы с маленьким коэффициентом поглощения. Похожая ситуация и с наклоненными на Север площадками, СИ туда практически не попадает, а вот ИК Земли такое же как и при наклоне на Юг, хотя в этом случае освещенность СИ максимальна.

Литература

1. Виссарионов В.И., Дерюгина Г.В., Кузнецова В.А., Малинин Н.К. Солнечная энергетика М.: Издательский дом МЭИ, 2008. - 276 с.

2. Сивков С.И. Методы расчета характеристик солнечной радиации, г. Ленинград: Гидрометеоиздат, 1968.-218 с.

3. Хргиан А.Х. Физика атмосферы, г. Ленинград: Гидрометеоиздат, 1969.-636с.

4. Матвеев Л.Т. Курс общей метерологии. Физика атмосферы, г.Ленинград: Гидрометеоиздат, 1984.-738 с.

5. Greenhalgh D., Tatnall A. R. Thermal model of an airship with solar arrays and a ballonet UK, IJRET, 2014.-79с.

6. Петров И.Б. Лобанов А.И. Лекции по вычислительной математике М.: Бином, 2006 - 523 с.

7. Савельев И.В. Курс общей физики, том I. Механика, колебания и волны, молекулярная физика .М.: Наука, 1970. - 504 с.

8. Сивухин Д.В. Общий курс физики М.: Наука. Физмалит 1996

9. Страуструп Б. Язык программирования С++. М.: Бином, 2011, - 1136 с.

Приложение

Подпрограмма integral:

#ifndef integral_for_P_H

#define integral_for_P_H

#include<math.h>

double g(double z) {

return 398.42825 / pow((6.367 + (z / 1000.0)), 2.0);

}

double T(double z) {

if (z >= 11.0 && z <= 20.0) return (-56.5 + 273.0);

else if (z > 20.0 && z < 47.4) return (-56.5 + 273.0 + (54.0 / 27.4)*(z - 20.0));

else if (z >= 47.4 && z <= 50.0) return (-2.5 + 273.0);

else if (z >= 0 && z < 11.0) return (15.0 + 273.0 -6.5*z);

else return 273.0;

}

double f(double z) {

return g(z) / T(z);

}

double p(double z) {

double I_sim = 0.0;

double a = 0.0;

double b = z;

double p0 = 100000.0;

if (z>=11.0){

a = 11.0;

p0=22699.9;

}

//разбиение

double h_1 = 0.001;

int N = (b - a) / h_1;

int n = N + 1;

double *x = new double[n];

double h = (b - a) / N;

x[0] = a;

for (int i = 1;i<n;i++) {

x[i] = x[i - 1] + h;

}

for (int i = 1;i<n;i++) { //формула Симпсона

I_sim += (1.0 / 6.0)*h*(f(x[i - 1]) + 4.0*(f((x[i - 1] + x[i]) / 2.0)) + f(x[i]));

}

delete[]x;

return (p0*exp((-28.98*I_sim) / 8.314));

}

#endif

Подпрограмма radius:

#include "radius.h"

#include<cmath>

const double PI = 3.1415926535;

class Kvadratnoe_uravn{

double A, B, C;

const double a = 149.59826;

const double b = 149.57624;

public:

void set_A(double phi){

A=((pow(cos(phi), 2.0) / pow(a, 2.0)) + (pow(sin(phi), 2.0) / pow(b, 2.0)));

}

void set_B(double phi) {

B = (5.0* cos(phi)/ pow(a, 2.0));

}

void set_C() {

C = (6.25/ pow(a, 2.0))-1.0;

}

double solve(double phi) {

set_A(phi);

set_B(phi);

set_C();

double r1, r2;

r1 = (-B + pow((pow(B, 2) - 4.0 * A*C), 0.5)) / (2.0 * A);

r2 = (-B - pow((pow(B, 2) - 4.0 * A*C), 0.5)) / (2.0 * A);

if (r1 > 0) {

return r1;

}

else if (r2 > 0) {

return r2;

}

else {

return 0;

}

}

};

double solar_const(double n){

double phi;

Kvadratnoe_uravn urav;

phi = (2.0*PI/360.0)*((360.0 / 365.0)*(n - 4.0));//пусть 4 января

return pow((149.6 / urav.solve(phi)), 2.0) * 1367.0;

}

Подпрограмма time1:

#ifndef time1_H

#define time1_H

class My_Time {

int hour;

int min;//double min;

public:

My_Time();

My_Time(int x, double y);

const My_Time operator+(const My_Time& t) const;

const My_Time operator-(const My_Time& t) const;

friend double convect_to_minute(const My_Time& t);

const double operator*(double x) const;

};

double convect_to_minute(const My_Time& t);

#endif

#include "time1.h"

//---------Клас для более удобной работы со временем-----//

My_Time::My_Time() {

hour = 0;

min = 0;

}

My_Time::My_Time(int x, double y) {

hour = x;

if (y<60.0 && y >= 0.0) {

min = y;

}

else if (y>60.0) {

int c = y / 60;

hour += c;

min = y - 60 * c;

}

else {

double buf_min = x * 60 + y;

hour = buf_min / 60;

min = buf_min - hour * 60;

}

}

const My_Time My_Time::operator+(const My_Time& t) const {

My_Time res(hour + t.hour, min + t.min);

return res;

}

const My_Time My_Time::operator-(const My_Time& t) const {

My_Time res(hour - t.hour, min - t.min);

return res;

}

const double My_Time::operator*(double x) const {

return x*hour + (x / 60.0)*min;

}

double convect_to_minute(const My_Time& t) {

return 60 * t.hour + t.min;

}

Подпрограмма solar:

#include "solar.h"

#include "integral.h"

#include <cmath>

using namespace std;

double rad(double x) {//перевод в радианы

return x*PI / 180.0;

}

My_Time E(double n1) {

double B = (360.0 / 365.0)*(n1 - 81.0);

B = rad(B);

My_Time res(0, 7.53*cos(B) + 1.5*sin(B) - 9.87*sin(2.0 * B));//E

return res;

}

double hour_angle(Coordinats coor) {//

double longitude_timezone = 15.0*coor.timezone;

My_Time noonday(12, 0);

My_Time correct(0, 4.0 * (coor.longitude_A - longitude_timezone));

My_Time real_noonday = (noonday - correct + E(coor.n));

return (coor.new_time - real_noonday) * 15.0;

}

double angle_declination(double n) {

double B = (360.0 / 365.0)*(284.0 + n);

B = rad(B);

return 23.45*sin(B);

}

double zenith_angle(Coordinats coor) {

double cos_zen = sin(rad(coor.latitude))*sin(rad(angle_declination(coor.n))) +

cos(rad(coor.latitude))*cos(rad(angle_declination(coor.n)))*cos(rad(hour_angle(coor)));

return acos(cos_zen);

}

double alfa(Coordinats coor) { //высота солнца

double a = (PI / 2.0) - zenith_angle(coor);

if (a > 0.0) return a;

else return 0.0;

}

double azimut(Coordinats coor) {

double tg_A = cos(rad(angle_declination(coor.n)))*sin(rad(hour_angle(coor)))

/ (cos(rad(angle_declination(coor.n)))*sin(rad(coor.latitude))*cos(rad(hour_angle(coor)))

- sin(rad(angle_declination(coor.n)))*cos(rad(coor.latitude)));

return atan(tg_A);

}

double cos_angle_Z(Coordinats coor, Ploshadka pl) {//угол падения СИ на пластину

return cos(rad(pl.beta))*sin(alfa(coor)) + sin(rad(pl.beta))*cos(alfa(coor))*cos(azimut(coor) - rad(pl.gamma));

}

double H(double z) { //высота однородной атм.

if (z == 0.0) return 8.0;

else return (p(z) / (1.276*g(z)))/1000.0;

}

double Rm(Coordinats coor, double z) {

//----Вход из формы

double c = coor.c;//0.43;//коэффициент прозрачности

//-----------------

double d = 6367.0 + z;

double sin_h = sin(alfa(coor));

if (sin_h>0){

//double m = H(z) / (H(0.0)*sin(alfa(coor)));

double m = (pow((pow(d*sin_h, 2.0)+2.0*d*H(z)+pow(H(z), 2.0)) , 0.5)-d*sin_h) / H(0.0);

return (solar_const(coor.n)) / (1.0 + c*m);

}

else return 0.0;

}

double R_horiz(Coordinats coor, double z) {

return Rm(coor, z)*sin(alfa(coor));

}

double R_t(Coordinats coor, Ploshadka pl) {

double R=Rm(coor, pl.z)*cos_angle_Z(coor, pl);

if (R>0) return R;

else return 0.0;

}

//рассеяние вверху

double D_horiz(Coordinats coor, double z) {

return (1.0 / 3.0)*(solar_const(coor.n) - Rm(coor, z))*sin(alfa(coor));

}

double D_t(Coordinats coor, Ploshadka pl) {

return D_horiz(coor, pl.z)*((1.0 + cos(rad(pl.beta))) / 2.0);

}

//отражение

//для Земли

double R_ref_groud(Coordinats coor, Ploshadka pl,Str_Ref ref) {

double f_n=f_oblch(coor.latitude, ref.n_all_cloud);

double Q = (R_horiz(coor, 0.0) + D_horiz(coor, 0.0))*f_n;

double VF=((1.0 - cos(rad(pl.beta))) / 2.0)*pow((6371.0/(6371.0+pl.z)), 2.0);

return ref.A_ground*Q*VF*(1.0-ref.n_ni_cloud);

//return ref.A_ground*Q*((1.0 - cos(asin(6371/(6371+pl.z)))) / 2.0);

}

double R_ref_cloud(Coordinats coor, Ploshadka pl,Str_Ref ref) {

if(pl.z > ref.h_cloud){

double VF=((1.0 - cos(rad(pl.beta))) / 2.0)*pow(6371.0/(6371.0+pl.z-ref.h_cloud), 2.0);

double Q = (R_horiz(coor, ref.h_cloud) + D_horiz(coor, ref.h_cloud));//*f_oblch(latitude, 0.1);

return ref.A_cloud*Q*VF*(ref.n_ni_cloud);

}

else return 0.0;

}

//рассеяная нижними слоями вверх

double D_verh(Coordinats coor, Ploshadka pl,Str_Ref ref) {

double horiz = (1.0 / 3.0)*(Rm(coor, pl.z) - Rm(coor, 0.0))*sin(alfa(coor));

return horiz*((1.0 - cos(rad(pl.beta))) / 2.0)*f_oblch(coor.latitude, ref.n_ni_cloud);

}

//Итоговые формулы

double QsumSolar(Coordinats coor, Ploshadka pl,Str_Ref ref, Str_Plos_pogl pogl){

//double f_c_sv=f_oblch(coor.latitude, ref.n_sv_cloud);//функция облочности над z

return ((R_t(coor, pl)+D_t(coor, pl))*f_oblch(coor.latitude, ref.n_sv_cloud)+

R_ref_groud(coor, pl, ref)+

R_ref_cloud(coor, pl, ref)+

D_verh(coor, pl, ref))*pogl.k_pogl*pogl.S;

}

/**************************IR********************************************/

double IK_groud(Ploshadka pl,Str_Ik ik){

double horiz = (1-ik.A_ik_ground)*5.67*pow(ik.T_ground/100.0, 4.0);

double m=p(pl.z)/100000.0;

double tau=1.716-0.5*(exp(-0.65*m)+exp(-0.95*m));

return (horiz*tau-IK_atm(pl, ik))*((1.0 - cos(rad(pl.beta))) / 2.0)*(6371.0/(6371.0+pl.z));

}

double IK_atm(Ploshadka pl, Str_Ik ik){

double a=0.82-0.25*pow(10.0, (-0.95*ik.e_1));

return a*5.67*pow(T(pl.z)/100.0, 4.0);

}

double QsumIr(Ploshadka pl, Str_Ik ik, Str_Plos_pogl pogl){

return (IK_groud(pl,ik)+IK_atm(pl,ik))*pogl.k_ikpogl*pogl.S;

}

double QsumIr_balans(Ploshadka pl, Str_Ik ik, Str_Plos_pogl pogl){

return (IK_groud(pl,ik)+IK_atm(pl,ik)-5.67*pow(pogl.T/100.0, 4.0))*pogl.k_ikpogl*pogl.S;

}

/************************************************************************/

//облачность

double f_oblch(double latitude, double n_oblch) {//вызов в суммаром подсчете

double a = 0.0;

if (latitude < 10) a = 0.38;

else if (latitude < 20) a = 0.40;

else if (latitude < 30) a = 0.36;

else if (latitude < 40) a = 0.38;

else if (latitude < 50) a = 0.40;

else if (latitude < 60) a = 0.36;

else if (latitude < 70) a = 0.18;

else if (latitude < 75) a = 0.16;

else if (latitude < 80) a = 0.15;

else if (latitude < 85) a = 0.14;

return 1.0 - ((a + 0.38*n_oblch)*n_oblch);

}

Подпрограмма widget:

#include "widget.h"

#include "ui_widget.h"

#include <QGraphicsTextItem>

#include <QDate>

#include <iomanip>

#include <stdlib.h>

#include <iostream>

#include <fstream>

#include <string>

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_z,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_S,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_koof_plosh,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_k_losh_IK,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->T_pl,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_betta,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_gamma,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->ball_obl_nize,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->bal_obl,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->bal_obl_vverh,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->Gr_obl_Verhn,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Albedo_co,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_e1,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->comboBox,SIGNAL(activated(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->Albedo_zem,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Albedo_zem_IK,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_dogota,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_shirota,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_utc,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->hourBox_2,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->minBox,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->UdateEdit,SIGNAL(dateTimeChanged(QDateTime)),this,SLOT(on_pushButton_clicked()));

connect(ui->Box_T_zenl,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));

}

//-------------------------------------------------------------------------//

// Вводим данные //

//-------------------------------------------------------------------------//

double Widget::n_wr()

{

QDate date(ui->UdateEdit->date());

int m=date.month();

double n=0;

for (int i=1;i<m;i++){ //2 мясяц приб только 31

if (i==4 || i==6 ||i==9|| i==11) {n+=30;}

else if (i==2){

if(date.daysInYear()==365) n+=28;

else n+=29;

}

else n+=31;

}

n+=date.day();

if(date.daysInYear()==366)

return (365.0/366.0)*n;

else return n;

}

double Widget::c_wr(){

double x=ui->horizontalSlider->value();

return 0.91-(0.0078788*x);

}

int Widget::min_wr()

{

return ui->minBox->value();

}

int Widget::hour_wr()

{

return ui->hourBox_2->value();

}

Coeffic Widget::Albedo_wr(){//для подстил. поверх.

Coeffic A;

int Index=ui->comboBox->currentIndex();

if(Index==0){

A.c=ui->Albedo_zem->value();

A.c_ik=ui->Albedo_zem_IK->value();

}

else if(Index==1){

A.c=0.10;

A.c_ik=0.03;

}

else if(Index==2){

A.c=0.26;

A.c_ik=0.03;

}

else if(Index==3){

A.c=0.35;

A.c_ik=0.05;

}

else if(Index==4){

A.c=0.70;

A.c_ik=0.014;

}

return A;

}

//-------------------------------------------------------------------------//

// Реакция кнопки решения //

//-------------------------------------------------------------------------//

void Widget::on_pushButton_clicked()//слот, что буде при нажатии кномпки

{

int hour=hour_wr();

int min=min_wr();

My_Time new_time(hour, min);//IN, только тут

Ploshadka pl;

Coordinats coor;

Str_Ref ref;

Str_Ik ik;

if((ui->bal_obl->value())>(ui->bal_obl_vverh->value())+(ui->ball_obl_nize->value())){

ui->ball_obl_nize->setValue((ui->bal_obl->value()));

}//поправка неверного ввода облачности

pl.beta=ui->Box_betta->value();

pl.gamma=ui->Box_gamma->value();

pl.z=ui->Box_z->value();

coor.timezone=ui->Box_utc->value();

coor.new_time=new_time;

coor.longitude_A=ui->Box_dogota->value();

coor.latitude=ui->Box_shirota->value();

coor.n=n_wr();//номер дня

coor.c=c_wr();

ref.A_ground=Albedo_wr().c;

ref.A_cloud=ui->Albedo_co->value();

ref.h_cloud=ui->Gr_obl_Verhn->value();

ref.n_sv_cloud= ((ui->bal_obl_vverh->value())*0.1);

ref.n_ni_cloud= ((ui->ball_obl_nize->value())*0.1);

ref.n_all_cloud= ((ui->bal_obl->value())*0.1);

ik.T_ground=(ui->Box_T_zenl->value()+273.0);

ik.A_ik_ground=Albedo_wr().c_ik;

ik.e_1=ui->Box_e1->value();

Str_Plos_pogl pogl;

pogl.k_pogl=ui->Box_koof_plosh->value();

pogl.k_ikpogl=ui->Box_k_losh_IK->value();

pogl.S=ui->Box_S->value();

pogl.T=(ui->T_pl->value()+273.0);

print_result(coor,pl,ref,ik, pogl);

}

//-------------------------------------------------------------------------//

// Печать результатов //

//-------------------------------------------------------------------------//

void Widget::print_result(Coordinats coor,Ploshadka pl, Str_Ref ref, Str_Ik ik, Str_Plos_pogl pogl){

ui->textEdit->clear();//текстовое поле сперва надо отчистить от мусора

double f_c_sv=f_oblch(coor.latitude, ref.n_sv_cloud);//функция облочности над z

double f_n=f_oblch(coor.latitude, ref.n_all_cloud);//функция облочности до земли

QString str, str1, str2;

str = "Высота солнца = "+QString::number(alfa(coor), 'f', 2)

+ "\t Азимут = " +QString::number(azimut(coor), 'f', 2) +"\n";

ui->textEdit->insertPlainText( str );

str1 = "Прямое СИ: \n\t гориз.площ \t"+QString::number(R_horiz(coor, pl.z)*f_c_sv, 'f', 5)

+ "\n\t наклон.площ \t" +QString::number(R_t(coor, pl)*f_c_sv, 'f', 5)

+ "\n\t Земля \t" +QString::number(R_horiz(coor, 0.0)*f_n, 'f', 5) +"\n";

ui->textEdit->insertPlainText( str1 );

str2 = "Рассеяное сверху СИ: \n\t гориз.площ \t"+QString::number(D_horiz(coor, pl.z)*f_c_sv, 'f', 5)

+ "\n\t наклон.площ \t" +QString::number(D_t(coor, pl)*f_c_sv, 'f', 5)

+ "\n\t Земля \t" +QString::number(D_horiz(coor, 0.0)*f_n, 'f', 5) +"\n";

ui->textEdit->insertPlainText( str2 );

QString str3,str4,str5;

str3 = "Отраженное СИ: \n\t отр.от Земли \t" + QString::number(R_ref_groud(coor, pl, ref), 'f', 5)

+ "\n\t отр. облаками \t" +QString::number(R_ref_cloud(coor, pl, ref), 'f', 5)

+ "\n\t расс. вверх \t" +QString::number(D_verh(coor, pl, ref), 'f', 5)

+ "\n\t Суммарное \t"

+QString::number(R_ref_groud(coor, pl, ref)+R_ref_cloud(coor, pl, ref)

+D_verh(coor, pl, ref), 'f', 5) +"\n";

ui->textEdit->insertPlainText( str3 );

str4 = "ИК: \n\t Земли \t"+QString::number(IK_groud(pl,ik), 'f', 5)

+ "\n\t окр.Воздуха \t"+ QString::number(IK_atm(pl,ik), 'f', 5)

+ "\n\t Суммарное \t"+QString::number(IK_groud(pl,ik)+IK_atm(pl,ik), 'f', 5)+"\n";

ui->textEdit->insertPlainText( str4 );

str5 = "Суммарное тепловое излучение поглащенное приемной площадкой: \n\t СИ : \t"

+QString::number(QsumSolar(coor, pl, ref,pogl), 'f', 2)+

" Вт \n\t ИК : \t"+QString::number(QsumIr(pl, ik, pogl), 'f', 2)+

" Вт \n ИК баланс: \t"+QString::number(QsumIr_balans(pl, ik, pogl), 'f', 2) + " Вт \n";

ui->textEdit->insertPlainText( str5 );

}

Widget::~Widget()

{

delete ui;

}

Размещено на Allbest.ru


Подобные документы

  • Физические основы рентгеновского излучения. Конструкция современных рентгеновских трубок. Расчет дозы и спектра рентгеновского излучения. Моделирование спектров излучения на языке C# в среде Microsoft Visual Studio Express, описание и алгоритм программы.

    дипломная работа [2,9 M], добавлен 26.02.2012

  • Алгоритмизация вычислительных процессов. Разработка интерфейса пользователя программы. Создание программного кода, анимации, справочной системы. Разработка программы для вычисления коэффициента мощности выпрямителя. Вывод графического изображения.

    курсовая работа [1,9 M], добавлен 28.04.2014

  • Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.

    курсовая работа [1,2 M], добавлен 24.04.2014

  • Проведение формализации математической модели и разработка алгоритма программы для определения локальных экстремумов функции средствами Delphi 7.0, Visual C. Создание инсталляционной версии приложения и его тестирование в различных операционных системах.

    курсовая работа [2,7 M], добавлен 11.06.2015

  • Разработка графического интерфейса проекта (панель инструментов имеет 6 кнопок). Процедуры разделов программы: документа ThisDocument, программного модуля Module1 и пользовательских форм UserForm1, UserForm2 и Деление_амёбы. Тестирование программы.

    курсовая работа [29,5 K], добавлен 14.12.2010

  • Создание программного приложения для осуществления основных функций по заказу мебели, регистрации клиентов, сотрудничеству с поставщиками. Разработка интерфейса прикладной программы. Логическое проектирование базы данных и SQL-скрипт генерации таблиц.

    курсовая работа [2,4 M], добавлен 11.02.2013

  • Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.

    дипломная работа [1,5 M], добавлен 09.11.2016

  • Вычисление определенных интегралов методом Симпсона. Функциональная схема программного комплекса. Реализация функции разбора произвольно заданных математических функций. Методика сохранения графика в графический файл. Интерфейс программного комплекса.

    курсовая работа [1,7 M], добавлен 15.06.2009

  • Создание программы для вычисления значения функции на основе определённой формулы. Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления. Разработка алгоритмов для реализации работы программного обеспечения.

    курсовая работа [240,6 K], добавлен 17.06.2013

  • Формирование устойчивой последовательности псевдослучайных чисел с использованием метода "середины квадрата". Разработка программы для определения среднего значения чисел, среднего значения квадратов чисел и дисперсии для последовательности из 20 чисел.

    лабораторная работа [1,4 M], добавлен 21.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.