Программирование и научные вычисления на языке Python/§2/Упражнения

Материал из Викиверситета

Тест[править]

  

1 Что выведет следующая инструкция: print 14/5 - 7*6 ?

-40
-40.0
-39.2

2 Что выведет следующая программа?

from math import sqrt as s
print s(16)/5

0
0.8
Ничего, произойдет ошибка.

3 Какая встроенная функция выводит документацию о модуле или функции?

dir()
help()
type()


Траектория мяча[править]

В первом уроке мы рассматривали полет мяча, подброшенного вертикально с некоторой начальной скоростью v0. А что будет, если тот же мячик кинуть под некоторым углом к горизонту θ? Такая задача тоже решается еще в школьном курсе физики, и мы можем описать траекторию движения мяча y = f(x) следующим образом:

(2.3)

В этом выражении:

  • x - горизонтальная координата
  • g - ускорение свободного падения
  • v0 - начальная скорость, направленная к оси x под углом θ

Начальное положение мяча, как видно из формулы задается как (0, y0).

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

Учтите, что людям удобнее задавать угол в градусах, а математические функции принимают значения в радианах. Не забывайте проверять свои результаты на калькуляторе. Название программы: trajectory_of_a_ball.py.

Вариант 1:

#!/usr/bin/python
# -*- coding: utf8 -*-
from math import tan, pi, cos
 
# задаёмся переменными
x=100      # координата х
tetta=30 # начальный угол 
g=9.81   # ускорение свободного падения (м/с**2), можно подставить значение и для Луны
v=1020 # начальная скорость (м/с), типовая скорость снаряда
y0=2 # начальная вертикальная координата 
 
# сразу задаёмся радианами
rad=180/pi
tetta1=tetta/rad # вместо градусов получили количество радиан 
 
y = x*tan(tetta1)-1/(2*v**2)*(g*x**2)/(cos(tetta1)**2)+y0

# вывод оптимизирован под консоль Windows!!!
result='Высота мяча '+str(y)[:4]+' м при начальном угле '+str(tetta)[:6]+' градусов и начальной скорости '+str(v)+' м/с, координата х='+str(x)[:4]+' м'
print (result.decode('utf8'))

Вариант 2:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from math import *

v0    = float(input("Введите начальную скорость: "))
theta = radians(float(input("Введите градус направления полёта: ")))
x     = float(input("Введите точку горизонтальной координаты: "))
y0    = float(input("Введите позицию мяча: "))
g     = 9.81

y = x*tan(theta)-1/(2*v0**2)*(g*x**2)/(cos(theta)**2)+y0
print("Траектория мяча составляет %g м." %y)

Гауссово распределение[править]

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

(2.4)

здесь m и s положительные параметры. Создайте программу, определяющую значении функции распределения для m = 0, s = 2 и x = 1. Проверьте результат. Название программы: Gaussian_function1.py.

#!/usr/bin/python
# -*- coding: utf8 -*-

# импортируем математику
from cmath import sqrt as kv, exp, pi

# задаёмся переменными
m=0
s=2
x=1

# разбиваем сложные выражения на куски
#z1=1.0/(kv(2*pi*s))        опечатка!
z1=1.0/(kv(2*pi)*s)
z2=(x-m)/1.0/s
z2=z2**2
z2=(-0.5)*z2
z3=z1*exp(z2)

#------------------------
print "Результат вычислений", z3

Сопротивление воздуха движению мяча[править]

Сила сопротивления воздуха движению любого объекта может быть описана так:

(2.5)

В этом выражении:

  • плотность воздуха
  • V — скорость объекта
  • A — его поперечная площадь (для мяча находится как πr2)
  • CD — коэффициент, зависящий от формы объекта и неровности его поверхности.

Напишите программу, которая рассчитывает силу сопротивления и силу тяжести и выводит:

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

Для мяча принять: = 1.2 кг/м3, масса мяча 0.43 кг,СD = 0.2.

Сравните результаты при сильном сопротивлении, когда скорость мяча достигает 120 км/ч и слабом - с V = 10 км/ч. Не забудьте, что в физике обычно используют одну систему, СИ. Название программы: kick.py.

Вариант 1:

#!/usr/bin/python
# -*- coding: utf8 -*-

from math import pi
Cd=0.2				# коэффициент "обтекаемости" мяча []
sigma=1.2				# плотность воздуха [кг/м**3]
r=0.11				# радиус футбольного мяча около 11 см
A=pi*r**2				# площадь поперечного сечения мяча
Vkmph=10				# скорость мяча [км/ч]
V=Vkmph*1000.0/3600		# теперь [м/с]
Fs=0.5*Cd*sigma*A*V**2	# сила сопротивления воздуха в Ньютонах, т.е. в кг*м/с**2

#--------------------------------------------------------------------------------

m=0.43					# масса мяча [кг]
g=9.8					# ускорение свободного падения [м/с**2]
Fg=m*g					# сила тяжести для мяча [Н]

print (u"При V=%g км/ч сопр-ие воздуха %.3g Н, сила тяжести %.3g Н." %(Vkmph,Fs,Fg))

#P.S. Не забываем делать проверку размерности даже в чужих расчетах ;)))

Вариант 2:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from math import *
from numpy import *

sigma = 1.2                                 # Плотность воздуха
V     = [120, 10]                           # Скорость объекта
V     = [V[0]*1000/3600, V[1]*1000/3600]    # Скорость мяча в СИ
r     = float(input("Введите радиус мяча: "))
A     = pi*r**2                             # Поперечная площадь мяча
CD    = 0.2                                 # Коэффициент, зависящий от формы 
                                            # объекта и неровности его поверхности
g   = 9.81                                  # Ускорение свободного падения
m   = 0.43                                  # Масса мяча

def Force(i):
    Fd = 1/2*CD*sigma*A*V[i]**2             # Сила сопротивления
    Ft = m*g                                # Сила тяжести
    F  = Fd / Ft                            # Отношение этих значений
            
    print("Сила сопротивления мяча равна %g Н" %Fd)
    print("Сила тяжести мяча равна %g Н" %Ft)
    print("Отношение силы сопротивления мяча к силе тяжести составляет %g " %F)

print("При сильном сопротивлении V=%g: " %V[0])    
Force(0)
print("\nПри слабом сопротивлении V=%g: " %V[1])  
Force(1)

Как сварить отличное яйцо[править]

Когда готовится яйцо, то белки сначала денатурируют, а потом свертываются. Когда температура превышает критическую точку, начинаются реакции, которые ускоряются с ростом температуры. Для белка критическая температура составляет 63°С, в то время как для желтка порядка 70°С. Для яйца всмятку соответственно температура должна находится между двух этих точек.

В следующей формуле определяется время t (в секундах), при которой центр желтка нагревается до температуры Ty (в градусах Цельсия):

(2.6)

В этой сложной формуле M, ρ, c и K параметры яйца:

  • M — масса (от 47 г для маленького яйца до 67 г для большого)
  • ρ — плотность (1.038 г/см3)
  • с — удельная теплоемкость (3.7 Дж/(г °С))
  • K — коэффициент теплопроводности (5.4 * 10^{-3} Вт/(см °С).

Кроме того, в формуле мы видим неизвестные температуры: Tw — температура кипящей воды (100°С) и T0 — температура яйца перед тем, как его опустили в кипящую воду (например, если его только достали из холодильника то это около 4°С или в другом случае комнатную температуру можно принять равной 20°С).

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

Вариант 1:

#!/usr/bin/env python
# -*- coding: utf8 -*-

from math import pi, log

# Оставляем все величины в граммах и сантиметрах, корректнее было бы писать
# параметры через абсолютные температуры в Кельвинах [К], но в данной задаче
# это не существенно, на размерность и числовое значение не влияет.
# Посмотрим 8-)

M=47					# масса яйца [г]

C=3.7			# удельную теплоемкость (скорлупы/белка/желтка) 
                    

Pd=1.038		# плотность вышеописанной субстанции [г/см**3]

K=5.4*10^{-3}			# коэффициент теплопроводности уже приведен к граммам
		# (установлено путем поиска величины для воды) 1000*[Вт/(см*К)]
					
T0=4			# температура яйца из холодильника в град. Цельсия
Tw=100			# температура кипящей воды
Ty=70			# желаемая температура желтка для смятки :-Р

# Посчитаем коэффициент перед логарифмом и сам логарифм...

A=M**(2.0/3)*C*Pd**(1.0/3)/(K*pi**2*(4*pi/3)**(2.0/3))	# коэффициент [с]
LOG=log(0.76*(Tw-T0)/(Tw-Ty))					# логарифм
t=A*LOG						# итоговое время [с]

print u"Время варки маленького яйца всмятку в кипящей воде %d c." %t

Вариант 2:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from math import *

M   = float(input("Введите массу яйца от 47 до 67 г: "))
c   = 3.7               # Удельная теплоёмкость
rho = 1.038             # Плотность
K   = 5.4*10^{-3}       # Коэффициент теплопроводности
T0  = [4, 20]           # Температура яйца перед тем, как его опустили в 
                        # кипящую воду
Tw  = 100               # Температура кипящей воды
Ty  = [70, (63+70)/2]   # Критическая температура для желтка / яйца всмятку

def Time(i, j):
    t = (M**(2/3)*c*rho**(1/3))/(K*pi**2*(4*pi/3)**(2/3))*log(0.76*(T0[i]-Tw)/(Ty[j]-Tw))
    tm = t/60           # Количество минут
    ts = t%60           # Количество секунд
    print("%d минут %d секунд\n" %(tm, ts))
    
print("Яйцо вкрутую, если его только достали из холодильника, следует варить")
Time(0, 0)

print("Яйцо вкрутую при комнатной температуре следует варить")
Time(1, 0)

print("Яйцо всмятку, если его только достали из холодильника, следует варить")
Time(0, 1)

print("Яйцо всмятку при комнатной температуре следует варить")
Time(1, 1)

Исправление ошибок[править]

В некоторых из этих выражений содержатся ошибки. Попробуйте найти в которых и объяснить, что не так. Проверьте свои догадки, последовательно вводя выражения в интерактивном режиме. Некоторые из них уже видны сейчас из-за подсветки синтаксиса.


1a = 2
a1 = b
x = 2
y = X + 4 
from Math import tan
print tan(pi)
pi = "3.14159'
print tan(pi)
c = 4**3**2**3
_ = ((c-78564)/c  +  32))
discount = 12%
AMOUNT = 120.-
amount = 120$
address = hpl@simula.no
and = duck
class = 'INF1100, gr 2"
continue_ = x > 0
bærtype = """jordbær"""
rev = fox = True
Norwegian = ['a human language']
true = fox is rev in Norwegian


Продолжаем?[править]

Если у вас получилось выполнить все упражнения, то, передохнув, продолжим наши занятия.