Разработанный нами математический пакет "Граф" позволяет чрезвычайно просто проводить вычисления и строить графики без инсталляции и скачивания каких-либо программ. Просто наберите формулу в адресной строке и получите результат в броузере. Формула задаётся в конце адреса cgi-скрипта http://physics.nad.ru/cgi-bin/gra.pl после вопросительного знака. При этом все дополнительные параметры указываются через ";". Например:
http://physics.nad.ru/cgi-bin/gra.pl?sin(x)Если набрать эту ссылку в адресной строке (или просто нажать на ссылку выше), то появится окно с графиком функции, который можно сохранить к себе на компьютер как PNG-рисунок. Рисунок имеет прозрачный фон, т.ч. можно накладывать несколько графиков друг на друга.
Если вы хотите вставить этот график на интернет страницу, то это можно сделать, как для обычного рисунка:
<img src="http://physics.nad.ru/cgi-bin/gra.pl?sin(x)">Или, предположим, нужно получить значение exp(3)*sin(5)+ln(4). Пишем в адресной строке http://physics.nad.ru/cgi-bin/gra.pl?exp(3)*sin(5)+ln(4) и получаем ответ в текстовом виде: -17.8742145641675
Если формулы неудобно набирать в адресной строке, то можно написать формулу в окошке ввода текста сообщения форума, выделить формулу курсором и нажимать кнопку F(x) из панели инструментов внизу окна ввода. В результате формула оказывается заключённой в теги gra, которые активируют конвертор.
Итак, в окне ввода текста набрана строка:
<gra>sin(x)</gra>Нажимаем "Просмотр" и получаем график функции sin(x), а также корни этой функции на интервале от 0 до 2π, заданных по умолчанию. Теперь вместо sin(x) наберём sin(5) и заключим его в теги gra: |
f=sin(x);
xmin=0, xmax=6.28318530717959 |
Также для удобства ввода формул и просмотра результатов можно использовать http://physics.nad.ru/cgi-bin/graph.pl В появившееся окошко формулы вводятся без тегов <gra>. В дальнейшем тексте мы будем их также опускать, хотя для ввода формул через форум они необходимы.
Постоянный адрес обновляемого описания пакета "ГРАФ" здесь:
http://physics.nad.ru/graph.html
Это описание можно также вызвать из окна ввода текста сообщений командой
<gra>help</gra>.
Пожалуйста, тестируйте и присылайте свои дополнения к этому пакету в виде
подпрограмм, написанных на Perl (или также на C или PHP). Архив обсуждения
на форуме:
http://physics.nad.ru/matboard/themes/23481.html
| Функция | Описание | Пример |
| + | Сложение | |
| - | Вычитание | |
| / | Деление | |
| * | Умножение | |
| ** | Возведение в степень (можно также ^) | 3**2=9, 3^2 = 9 |
| abs(x) | Вычисление абсолютного значения выражения x. | abs(-5) = 5 |
| cos(x) | Вычисление функции cos, выражение x в радианах. | cos(pi) = -1 |
| sin(x) | Вычисление функции sin, выражение x в радианах. | sin(pi/2) = 1 |
| atan2(x,y) | Вычисление arctg(x/y). | atan2(1/1) = 0.785398163397448 |
| exp(x) | Вычисление значения экспоненциальной функции x. | exp(1) = 2.71828182845905 |
| log(x) | Вычисляет натуральный логарифм числа x (по основанию e). | log(2.71828182845905) = 1 |
| sqrt(x) | Вычисляет квадратный корень числа x. | sqrt(9) = 3, sqrt(-1) = i |
| rand(x) | Возвращает случайное дробное число в интервале 0 до значения параметра x. | rand(10) = 6.18115656349016 |
| hex(x) | Интерпретирует строковое выражение x как шестнадцатиричное число и вычисляет его десятичный эквивалент | hex(FF) = 255 |
| oct(x) | Интерпретирует строковое выражение x как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов "0x", то ее содержимое интерпретируется как шестнадцатиричное число. | oct(11) = 9 |
| int(x): | Вычисление целой части числа (отбрасывается дробная часть). | int(3.1415926535) = 3 |
| Дополнительные функции | Пояснения |
| tan | tan(z) = sin(z) / cos(z) |
| csc, cosec, sec, sec, cot, cotan | csc(z) = 1 / sin(z) sec(z) = 1 / cos(z) cot(z) = 1 / tan(z) |
| asin, acos, atan | asin(z) = -i * log(i*z + sqrt(1-z*z)) acos(z) = -i * log(z + i*sqrt(1-z*z)) atan(z) = i/2 * log((i+z) / (i-z)) asin(1) = 1.5707963267949 |
| atan2(z1,z2) | atan2(z1,z2) = atan(z1/z2) |
| acsc, acosec, asec, acot, acotan | acsc(z) = asin(1 / z) asec(z) = acos(1 / z) acot(z) = atan(1 / z) |
| sinh, cosh, tanh | sinh(z) = 1/2 (exp(z) - exp(-z)) cosh(z) = 1/2 (exp(z) + exp(-z)) tanh(z) = sinh(z) / cosh(z) |
| csch, cosech, sech, coth, cotanh | csch(z) = 1 / sinh(z) sech(z) = 1 / cosh(z) coth(z) = 1 / tanh(z) |
| asinh, acosh, atanh | asinh(z) = log(z + sqrt(z*z+1)) acosh(z) = log(z + sqrt(z*z-1)) atanh(z) = 1/2 * log((1+z) / (1-z)) |
| acsch, acosech, asech, acoth, acotanh | acsch(z) = asinh(1 / z) asech(z) = acosh(1 / z) acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1)) |
| pi | 3.14159265358979 |
| deg2rad(x) | Перевод градусов в радианы (x - в градусах) |
| rad2deg(x) | Перевод радиан в градусы (x - в радианах) |
| cbrt, log10, logn(z, n) | cbrt(z) = z ** (1/3) log10(z) = log(z) / log(10) logn(z, n) = log(z) / log(n) |
| ln | ln(exp(1)) = 1 |
| Re(z), Im(z) | Мнимая и действительная часть |
| abs(z), arg(z) | Полярные координаты z (r,j) |
Комплексные числа можно записать в полярных и декартовых координатах. В декартовых координатах это a+b·i, а в полярных - r·exp(it). Соответственно некоторое комплексное число z можно перевести в декартовы координаты оператором z->{d}, а в полярные - оператором z->{p}. Модуль комплексного числа находится как abs(z), а угол в полярных координатах - как arg(z). Re(z), Im(z) - действительная и мнимая часть z. Ввести комплексное число можно или как a+bi, или cplx(a,b), или просто z=(a,b). В полярных координатах число вводится как cplxe(r,t) или просто как z=[r,t]. Результат в полярных координатах отображается как [r,t]. И ещё один ньюанс. Если zn = [r,t], то, находя корень кубический из [r,t] угол может определяться неоднозначно. Например корень кубический из [8,pi] может быть и [2,pi/3], и [2,pi], и [2,5pi/3]. k-ое значение корня n-ой степени находится через функцию (root(z,n))[k]. cbrt(z) находит только одно (первое) решение кубического корня.
Комплексные числа можно складывать, делить, подвергать их действию различных функций:
Пусть z1 = a + bi = r1 * exp(i * t1) и z2
= c + di = r2 * exp(i * t2)
Тогда z1 + z2 = (a + c) + i(b + d)
z1 - z2 = (a - c) + i(b - d)
z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
z1 ** z2 = exp(z2 * log z1)
abs(z) = r1 = sqrt(a*a + b*b) sqrt(z) = sqrt(r1) * exp(i * t/2)
exp(z) = exp(a) * exp(i * b)
log(z) = log(r1) + i*t
sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
| Функция | Пояснения |
| cplxe(r,t) или z=[r,t] | Ввод комплексного числа в полярных координатах |
| cplx(a,b) или a+b*i или z=(a,b) | Ввод комплексного числа в декартовых координатах |
| Re(z), Im(z), abs(z), arg(z) | Вещественная, мнимая часть комплексного числа, а также его абсолютная величина и угол в полярных координатах |
| z->{d}, z->{p} | Перевод комплексного числа соответственно в декартовы и полярные координаты |
| cbrt(z) | Кубический корень из комплексного числа |
| (root(z,n))[k] | k-ый корень для z = [r,t]
задаваемый: (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n) |
| <gra>Код</gra> | Результат |
| a=i a->{p} a |
[1,pi/2] |
| a=cplxe(1,pi/2) a->{d} a |
6.12303176911189e-17 + i |
| (1+i)(2+i)/(3+i)(4+i) | 1.6+3.8i |
| sqrt(-1) | i |
| abs(3+4i) | 5 |
| Re(3+4i) | 3 |
| Im(3+4i) | 4 |
| arg(1+i) | pi/4 |
| a=exp(i*pi/2) a->{d} a |
6.12303176911189e-17 + i |
| a=cplxe(1,
2*pi/3) b=a**3 b |
1 - 2.44921270764475e-16i |
Уравнение функции, константы и вспомогательные функции пишутся на отдельных строчках или разделяются символом точка-запятая ( ; ) Можно вообще написать, например, g(t)=sin(t) и тогда функция будет g, а аргумент - t. Комментарии отделяются символами %%.
Алгоритм таков:
Если в строчке нет знака равенства =, то смотрится есть ли там символ
x. Если x есть, то нужно строить график функции, если нет, то вычислить
число и показать его. Также смотрятся все остальные строчки, в которых
содержится знак равенства. Ecли это например g(t)=.., то g - функция, t -
переменная. Если f=.., то в строчке записана функция. Если это например с=5,
то с - константа, а 5 - её значение. Также проверяется наличие x во всех
остальных строчках. Если есть, то нужно строить график функции. В общем легче
смотреть на примерах. В любом случае зарезервированы буквы f под функцию,
a x под её аргумент (переменную). Как функция, так и её аргумент могут
быть вещественными или комплексными. Если значение функции комплексно, то по
вертикальной оси откладывается мнимое значение функции, а по горизонтальной -
вещественное. При этом x линейно меняется от xmin до xmax. Как xmin, так и xmax
могут тоже быть комплексными. Если строится комплексная функция, то левый нижний
угол задаётся как комплексное fmin, а верхний правый угол - комплексное fmax.
Если fmin или fmax отсутствует, то они вычисляются автоматически.
Также для задания масштаба по вертикали можно использовать
ymin и ymax. Есть 2 режима
масштабирования комплексной функции ratio=0 или 1. Если ratio=0, то функция
растягивается по горизонтали и вертикали до fmin, fmax. Если ratio=1, то
масштабы по осям одинаковые и fmin и fmax выбираются автоматически (ввод не
действует), чтобы отобразить всю функцию. Если у вас две функции одного
переменного (например f и
g) и вы хотите нарисовать их в осях XY, то выводите как cplx(f,g),
или как f+i*g, или как
(f,g). Название функций и из аргумента могут быть любыми.
| Параметр | Значение по умолчанию | Пояснения |
| xmin | xmin=0 | Минимальное значение аргумента. В случае комплексной функции также может быть комплексным. |
| xmax | xmax=2*pi | Максимальное значение аргумента. В случае комплексной функции также может быть комплексным. |
| fmin | вычисляется | Минимальное значение функции. При отсутствии вычисляется. В случае, если функция комплексная, то fmin также должна быть комплексной. В этом случае fmin задаёт левый нижний угол графика. |
| fmax | вычисляется | Максимальное значение функции. При отсутствии вычисляется. В случае, если функция комплексная, то fmax также должна быть комплексной. В этом случае fmax задаёт правый верхний угол графика. |
| ymin | вычисляется | Минимальное значение по координате Y. Используется при построении кривой по точкам, а также может заменить fmin для задания масштаба по вертикали. |
| ymax | вычисляется | Максимальное значение по координате Y. Используется при построении кривой по точкам, а также может заменить fmax для задания масштаба по вертикали. |
| points | points=100 | Количество точек по которым строится каждый график функции. Чем больше points, тем более гладкая кривая. но тем больше времени требуется для её расчёта. Если points велико, то отведённого на сервере лимита времени может не хватить для выполнения скрипта и возникнет ошибка. В этом случае уменьшите количество точек. |
| fbox | fbox=1 | Параметр fbox может принимать значение 0 или 1. Если fbox=0, то рамка графика не строится. Если fbox=1, то рамка строится. По умолчанию рамка строится. |
| spline | spline=0 | Этот параметр может принимать два значения 0 и 1. Если spline=0, то график строится отрезками прямых. Если spline=1, то график строится параболами. В некоторых случаях это может быть использовано для получения более гладкой кривой при небольшом количестве точек. С другой стороны это увеличивает время расчёта. |
| ratio | ratio=0 | Если строится комплексная функция, то она автоматически растягивается до границ отображаемого прямоугольника (ratio=0). В некоторых случаях это может быть неудобным, так как нарушает пропорции между действительной и мнимой частью функции. Например, если мы хотим построить график функции exp(i*x), то ожидаем увидеть окружность, а не эллипс. В этом случае используйте ratio=1. Масштаб по обоим осям будет одинаковым, а график растянется автоматически по одному направлению (исходя из пропорций графика и окна отображения). |
| nmax | nmax=1 | При построении на одном поле нескольких функций отличающихся одним параметром nmax задаёт максимальное количество графиков на поле. При этом переменная n будет меняться от 0 до nmax-1. |
| n | - | Если задано nmax, то переменная n меняется от 0 до nmax-1. |
| roots | roots=1 | Параметр roots может принимать два значения 0 и 1. Если roots=0, то корни уравнения f(x)=0 не вычисляются. Если roots=1, то корни вычисляются. По умолчанию корни вычисляются. Если имеется несколько функций, то корни вычисляются у главной (без цифровых индексов). |
| width | width=300 | Ширина окна в пикселях. |
| height | height=200 | Высота окна в пикселях. |
| animated(time,transparent) | animated(0,0) | Задаёт построение GIF анимации. Каждый кадр отличается параметром n. Поэтому также необходимо указать nmax. time задаёт время между кадрами анимации в миллисекундах. time=0 задаёт максимальную скорость смены кадров анимации. transparent=1 задаёт прозрачный фон. В этом случае кривые накладываются друг на друга. чтобы получить анимацию параметр animated должен быть установлен в 0. |
| Относящееся только к построению по точкам | ||
| begin | - | Начало массива точек. |
| end | - | Конец массива точек |
| polygon | - | Построение по точкам фигуры с заливкой. Идёт сразу после begin. |
| polyline | включён | Построение кривой по точкам фигуры без заливки. Идёт сразу после begin. Используется по умолчанию. |
| stat | - | Построение наилучшей прямой методом наименьших квадратов. Идёт сразу после begin. |
| points | включён | Если идёт сразу после begin, то помимо кривой (прямой, залитой фигуры) отображаются точки, по которым они были построены. |
| inv | - | При наличие inv в любом месте кода не показываются точки с z<0 |
Пример 1:
xmin=0 %% Минимальное значение аргумента (по умолчанию xmin=0)
xmax=5 %% Максимальное значение аргумента (по умолчанию xmax=2*pi)
fmin=-2 %% Минимальное значение функции (если пусто, то вычисляется)
fmax=10 %% Максимальное значение функции (если пусто, то вычисляется)
points=50 %% Количество точек на кривой (по умолчанию - 100)
width=400 %% Ширина рисунка в пикселях (по умолчанию - 300)
height=200 %% Высота рисунка в пикселях (по умолчанию - 200)
fbox=1 %% Наличие внешней рамки (по умолчанию - 1, т.е. присутствует)
a=x^4 %% Вспомогательная функция
b=10*x^3 %% Вспомогательная функция
c=35*x^2 %% Вспомогательная функция
d=50*x %% Вспомогательная функция
e=24 %% Вспомогательная функция
a-b+c-d+e %% Уравнение функции
Пример 2:
f=sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(x)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
xmin=0, xmax=6.28; fmin=-0.215,
fmax=0.215
Корни: 0; 3.14159265358979; 6.28318530717959
Пример 3:
fbox=0; width=700; points=500; roots=0
sin(6*sin(5*x))
f=sin(6*sin(5*x)); xmin=0,
xmax=6.28, fmin=-0.997, fmax=0.9967
Пример 4:
Затухающие гармонические колебания.
xmax=4*pi; ratio=1
exp(-0.5*x)*exp(i*x)
f=exp(-0.5*x)*exp(i*x);
xmin=0, xmax=12.566
fmin=(-0.234 + i*-0.207); fmax=(1 + i*0.615)
Можно также строить графики комплексных функций от комплексной переменной. Пусть, например, x меняется от i до 1. Найдём как выглядит функция x^n для нескольких произвольных n. Результат ниже.
| f=x; xmin=i, xmax=1 fmin=(-1 + i*-1), fmax=(1 + i*1) |
f=x**2; xmin=i, xmax=1 fmin=(-1 + i*-1), fmax=(1 + i*1) |
f=x**3; xmin=i, xmax=1 fmin=(-1 + i*-1), fmax=(1 + i*1) |
f=x**4; xmin=i, xmax=1 fmin=(-1 + i*-1), fmax=(1 + i*1) |
|
f=x**9; xmin=i, xmax=1 fmin=(-1 + i*-1), fmax=(1 + i*1) |
Проверка для f=x^2: x=t+i*(1-t), где t=0..1 |
f=0.5*(1-x**2); xmin=1,
xmax=-1 fmin=-1, fmax=1 |
|
|
Следующий пример демонстрирует построения графиков, отличающихся параметром
n. Задано максимальное количество графиков
на одном поле (nmax=5). При этом переменная n меняется от 0 до nmax-1.
|
f=a*(sin(2*x))*1/(x)+0.3*(cos(2*x));
xmin=-3.14, xmax=3.14, fmin=-0.574, fmax=2.3 |
Точки и построенные по ним кривые графики также могут быть преобразованы в GIF анимацию с меняющимся параметром n.
|
В примере ниже строится наилучшая прямая по точкам, к координатам которых
посредством функции rand добавлена случайная величина,
имитирующая погрешность измерения.
|
xmin=0.018121094411935, xmax=9.96057783549489 fmin=0.00498491452561467, fmax=9.94779613951097 |
($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
|
В следующем примере используется функция преобразования сферических координат в декартовы.
|
f=cplx(X,Z); xmin=0, xmax=6.28318530717959 fmin=(-0.998 + i*-1 ), fmax=( 0.998 + i*1 )
|
Преобразование вращения в декартовых координатах
nmax=50; animated(10,0)
|
Функции вращения в декартовых координатах: (x,y,z)=rotate(x,y,z,φ,θ) (x,y,z)=x_rotate(x,y,z,φ) (x,y,z)=y_rotate(x,y,z,φ) (x,y,z)=z_rotate(x,y,z,φ)
xmin=-2, xmax=2,
fmin=-2, fmax=2 |
|
Основная функция f должна быть без номера. Остальные функции должны начинаться с
той же буквы f, а затем идут произвольные числовые
номера. Если основная функция переопределена как например g(t)=...,
то остальные должны быть g1=.., g2=.., g101=.. и т.д. При этом дополнительные
функции тоже будут иметь в качестве аргумента переменную t. Корни вычисляются
только у основной функции. Цвет каждой кривой задаётся
как color0=.., color1=... Далее значение цвета
покомпонентно (RGB) в шестнадцатиричном выражении.
color0 задаёт цвет графика основной функции.
Если значение цвета не пишется, то по умолчанию выбирается тёмно-синий
цвет кривой.
|
f=exp(i*x); xmin=0, xmax=6.28318530717959 fmin=(-1 + i*-0.998 ), fmax=( 1 + i*0.998 )
|
В этом примере строится 3 фигуры: две закрашенные (polygon)
и одна незакрашенная (polyline).
|
xmin=-47, xmax=47,
fmin=-32, fmax=32 |
|
В данном примере кривая построена по 3-м точкам, но не отрезками прямой,
а параболами. Это занимает несколько больше процессорного времени, но
делает строку запроса очень компактной и в ряде случаев позволяет хорошо
сглаживать кривую при недостаточности точек.
|
xmin=0, xmax=5,
fmin=-5, fmax=5 |
Координаты точек могут быть преобразованы по правилу:
x = f(x); y= g(y); z=h(z)
Например: x=x**2; y=log10(y); z=2*z;
Для построения прямой y=a+bx методом наименьших квадратов необходимо ввести свои данные (точки). Для этого можно использовать форму http://physics.nad.ru/stat.html. Данные вводятся в столбик парами x y через пробел между строками "begin stat points" и "end". Параметры width и height определяют размеры окна по горизонтали и вертикали. fbox=0 отключает отображение рамки и сетки графика. В результате работы скрипта отображается прямая y=a+bx, построенная методом наименьших квадратов, а также в текстовом виде значение коэффициентов a и b, а также их среднеквадратичные ошибки (стандартное отклонение) ±a и ±b. Точки отображаются крестиками (размер крестика не имеет отношения к погрешностям). Красными крестиками отображаются выпадающие точки, для которых отклонение от прямой превышает 3σ. Чтобы задать масштаб по осям нужно написать минимальное и максимальное значение x и y в столбик или через точку с запятой: xmin=...; xmax=...; ymin=...; ymax=...; Если минимальные и максимальные значения x и y не заданы, то они вычисляются автоматически.
Если зависимость между x и y носит нелинейный характер, то это можно её можно "распрямить", используя функции преобразования координат x=f(x) и y=g(y), которые помещаются внизу окна ввода. Пусть, например, известно, что зависимость между измеренными величинами x и y имеет вид y=kxn (закон Стефана-Больцмана) и требуется найти значение коэффициентов k и n. Прологарифмируем уравнение и получим log10(y)=log10(k)+n*log10(x). Записываем пары x y в столбик и внизу окна пишем функции преобразования x=log10(x); y=log10(y). В результате на графике получаем прямую с наклоном b=n, которая отсекает на оси y значение коэффициента a=log10(k).
Или другой пример. При небольших напряжениях на p-n переходе его сопротивление R будет постоянным и пропорциональным exp(eV/kT). Пусть измерена зависимость этого сопротивления y=R от температуры x=T и требуется найти высоту потенциального барьера V p-n перехода. Вводим значения сопротивления и температуры в форму и записываем внизу преобразование x=1/x; y=ln(y). По наклону прямой находим V.
Ещё один пример. Количество частиц N прошедших цилиндрический образец длинной l задаётся формулой N=Noexp(-μl). Заносим в форму данные: зависимость числа регистрируемых частиц (y) от длины образца (x). Записываем преобразование y=ln(y) и по наклону прямой находим коэффициент ослабления μ для данного материала.
begin stat points
| Построение прямой y = a + bx методом наименьших квадратов xmin=-9.1, xmax=9.9, fmin=-4.7, fmax=14.4
|
Суть цветовой схемы следующая. Строится график функции двух переменных f(x,y). Красным отмечены области, где f>0, и синим, где f<0. Чем интенсивнее цвет, тем ближе к нулю. Поэтому граница между синим и красным показывает решение уравнения f(x,y)=0. Зелёным заполняются остальные области (можно убрать, положив bitmap=3). Предусмотрены также другие цветовые схемы bitmap=1...9
xmin=-8; xmax=8Овалы Кассини.
|
|
Примеры построения графиков при помощи Граф
| Партнёры:
большой выбор: детское автомобильное кресло, бесплатная доставка система водоснабжения коттеджей хостинг |