Интеграл работы в классической механике
Продемонстрируем независимость пути интеграла от работы для консервативного силового безвихревого поля, например – гравитационного поля сферы.
Определим потенциальную энергию частицы массы m в поле звезды (или планеты) массы M:
- V:=-G*M*m/r;
- with(linalg):
- F:=-grad(V,[x,y,z]);
Не работает! Запишем иначе.
- F:= -grad(V,[r,theta,phi],coords=spherical);
- evalm(F[1]);
Тоже не то, что надо...
Причина в том, что знак «–» перед grad дает ошибку при выполнении команды grad из-за несоответствия возвращаемому типу данных (должен быть вектор). Исправить это можно, поставив знак минус перед скалярной функцией потенциала V.
- F:=grad(-V,[r,theta,phi],coords=spherical);
- F[1];
ОК, Maple имеет свои особенности! Ему не нравился знак «–» перед градиентом.
- curl(F,[r,theta,phi],coords=spherical);
Силовое поле не вихревое по построению, поскольку получено из скалярного потенциала.
Для построения потенциальной энергии следует перейти в декартовы координаты. Покажем потенциал на фиксированной плоскости z = 1 (рис. 4.10.1):
- PL1:=plot3d(subs(r=sqrt(x^2+y^2+1),G=1,M=1,m=1,V),
x=-5..5,y=-5..5,axes=boxed): plots[display](PL1);

Рис. 4.10.1
Выберем прямолинейный путь:
- r_i:=[2,2,1];
- r_f:=[-2,0,1];
- r_t:=r_i+(r_f-r_i)*t;
- evalm(r_t);
Примечание: здесь t – параметр, но это не обязательно время. Тем не менее назовем производную от представляемых параметров v_t:
- v_t:=diff(r_t,t);
Теперь интеграл работы сводится к параметрическому интегралу от скалярного произведения F и v_t, но следует понимать, что F необходимо оценивать вдоль пути, т. е. как F(r_t)!!!
Кроме того: параметрическое представление было определено в декартовых координатах, поэтому именно эти координаты надо использовать для вычисления скалярного произведения, т. е. в них следует представить силу:
- F:=grad(-subs(r=sqrt(x^2+y^2+z^2),V),[x,y,z]);
Начнем с распространенной ошибки:
- Work:=int(dotprod(F,v_t),t=0..1);
Это плохой ответ по нескольким причинам:
- работа должна представляться числом (поскольку указаны начальная и конечная точки пути);
- нет оценки силы вдоль выбранного пути.
- r_t:=evalm(r_t);
- Work:=int(dotprod(subs(x=r_t[1],y=r_t[2],
z=r_t[3],F),v_t),t=0..1);
Это расстраивает: очевидно, что делаем правильно, но получаем все тот же неправильный ответ!!!
Как избежать этой ловушки?
Посмотрим на подвыражения и поймем, что что-то не сработало.
Для подстановки векторов и матриц в Maple нужно применить op():
- dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],op(F)),v_t);
Это правильное подынтегральное выражение: оно больше не зависит от x, y, z, а зависит только от параметра t.
Теперь интегрируем:
- Work:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],
op(F)),v_t),t=0..1);
Альтернативой использованию op() является преобразование созданного grad вектора в список:
- FL:=convert(F,list);
- Work:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],FL),
v_t),t=0..1);
- evalf(%);
Интеграл работы показывает, как изменилась кинетическая энергия между r_i и r_f за счет работы, выполненной силой над массой m. Cравним этот результат с разницей в потенциальной энергии:
- r_i;
Нам нужна функция, вычисляющая размер вектора положения:
- v_mag:=v->sqrt(add(v[i]^2,i=1..3));
- v_mag(r_i),v_mag(r_f);
- subs(r=v_mag(r_i),V)-subs(r=v_mag(r_f),V);
Различие между потенциальной энергией в начальной и конечной точках равнозначно работе, проделанной над частицей, или изменению кинетической энергии:
- Work-%;
- with(plottools);
- l := line(r_i, r_f, color=red, linestyle=2,
thickness=3): plots[display](l,PL1);
На трехмерном графике (не показан) высота фигуры – это потенциальная энергия, которую более подробно покажем на рис. 4.10.2. Но сначала сделаем небольшие преобразования.
- r_iV:=r_i: r_iV[3]:=subs(r=v_mag(r_i),G=1,M=1,m=1,V): r_iV;
- r_fV:=r_f: r_fV[3]:=subs(r=v_mag(r_f),G=1,M=1,m=1,V): r_fV;
- l := line(r_iV, r_fV, color=red, linestyle=2, thickness=3):
plots[display](l,PL1);

Рис. 4.10.2
Когда частица проходит потенциальную яму, то на пути вниз она накапливает много кинетической энергии, чтобы отдать ее значительную часть при подъеме вверх. В этом можно убедиться, рассчитав работу, проделанную в некоторой промежуточной точке.
Сначала найдем заново суммарный прирост кинетической энергии:
- evalf(Work);
Разобьем путь на две половины: между t = 0 и t = 0.5 и между t = 0.5 и t = 1:
- Work1:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],
op(F)),v_t),t=0..1/2);
- Work2:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],
op(F)),v_t),t=1/2..1);
- evalf([Work1,Work2,Work1+Work2]);
В первой половине над частицей выполняется большая работа, затем частица работает «против» потенциальной ямы, но в конечной точке все еще есть чистый прирост кинетической энергии. Однако в этот момент она имеет более низкое значение потенциальной энергии, т. е. приобретает кинетическую энергию за счет потенциальной энергии.
Теперь решим задачу с неконсервативной силой. Она придумана, чтобы показать, что происходит в неконсервативном силовом поле. Непосредственного физического смысла здесь нет.
- restart;
- F:=[x^2+2*y-z,y+z-x,z^3+x*2];
- with(linalg):
- curl(F,[x,y,z]);
То есть это силовое поле имеет вихрь, а значит, его нельзя получить из скалярного потенциала. Выбираем тот же путь, что и раньше:
- r_i:=[2,2,1];
- r_f:=[-2,0,1];
- r_t:=evalm(r_i+(r_f-r_i)*t);
- v_t:=diff(r_t,t);
Еще одна из особенностей Maple. В результате того, что тип переменной r_t определен как список (list), evalm выдал «не то». Проверим тип переменной:
- whattype(r_t);
То есть evalm понял r_t как символ:
- v_t:=map(diff,r_t,t);
Если не применять evalm, то сработало бы простое дифференцирование, потому что t проявилось как множитель одного из списков (как в предыдущей задаче).
- Work1:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],F),
v_t),t=0..1/2);
- Work2:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],F),
v_t),t=1/2..1);
- Work:=int(dotprod(subs(x=r_t[1],y=r_t[2],z=r_t[3],F),
v_t),t=0..1);
- evalf([Work1,Work2,Work1+Work2,Work]);
Конечно, интеграл работы аддитивен. Покажем, что если две конечные точки соединены как-то иначе, то работа, выполненная над частицей при ее перемещении из A в B, получится другой.
Выберем другой прямой путь от A до B, который проходит в плоскости через начало в точке [0, 0, 1]:
- r_1:=[0,0,1];
- r_tp1:=evalm(r_i+(r_1-r_i)*t);
- v_tp1:=map(diff,r_tp1,t);
- r_tp2:=evalm(r_1+(r_f-r_1)*t);
- v_tp2:=map(diff,r_tp2,t);
Вычислим интеграл:
- Work1:=int(dotprod(subs(x=r_tp1[1],y=r_tp1[2],
z=r_tp1[3],F),v_tp1),t=0..1);
- Work2:=int(dotprod(subs(x=r_tp2[1],y=r_tp2[2],
z=r_tp2[3],F),v_tp2),t=0..1);
- evalf([Work1+Work2,Work]);
Количество выполненной над частицей работы при ее движении через силовое поле по другому пути – другое!
Что можно сделать, чтобы визуализировать силовое поле, и как оно влияет на частицу?
Сначала найдем силовое поле в плоскости z = 1 без учета z-компоненты силы, так как частица не перемещается вдоль z (эта составляющая силы не выполняет никакой работы!). Результат показан на рис. 4.10.3.
- Fzeq1:=subs(z=1,F);
- F2d:=[Fzeq1[1],Fzeq1[2]];
- with(plots):
- PL1:=fieldplot(F2d,x=-2..2,y=-2..2,arrows=thick,color=blue,
axes=boxed,grid=[12,12]): display(PL1); - with(plottools):
- l1 := line([r_i[1],r_i[2]], [r_f[1], r_f[2]],
color=red, linestyle=2, thickness=3): - l2 := line([r_i[1],r_i[2]], [r_1[1], r_1[2]],
color=green, linestyle=2, thickness=3): - l3 := line([r_1[1],r_1[2]], [r_f[1], r_f[2]],
color=green, linestyle=2, thickness=3): - display(l1,l2,l3,PL1);

Рис. 4.10.3
Работа, выполняемая над частицей при ее движении через такое поле, по разным траекториям различна, потому что в разных областях пространства векторы силы могут иметь разную длину и разные ориентации (см. рис. 4.10.3). Результат таков: движение по замкнутому контуру (петле) в не-безвихревом силовом поле позволяет приобрести (или потерять) энергию. Картинка на рис. 4.10.3 поясняет, почему поле называется не-безвихревым.
- evalf([Work1,Work2,Work1+Work2,Work]);
F
Обратите внимание, что работа, проделанная силой над частицей, отрицательна. Движение частицы начинается в [2, 2] (верхний правый угол), и она движется против силового поля (см. рис. 4.10.3). В [0, –2] она приходит с отрицательным количеством работы, так как работа выполнялась против силового поля. Это означает, что кинетическая энергия частицы в В меньше, чем в A. При этом в зависимости от того, выбран красный или зеленый путь (см. рис. 4.10.3), энергия в B меньше, чем в A, на разную величину.
Рассчитайте работу, проделанную над частицей вдоль пути так, чтобы она набрала энергию для перехода от A = [2, 2, 1] к B = [– 2, 0, 1].
Решение
- r_i,r_f;
- r_1:=[2,-2,1];
- r_tp1:=evalm(r_i+(r_1-r_i)*t);
- r_2:=[-2,-2,1];
- v_tp1:=map(diff,r_tp1,t);
- r_tp2:=evalm(r_1+(r_2-r_1)*t);
- v_tp2:=map(diff,r_tp2,t);
- r_tp3:=evalm(r_2+(r_f-r_2)*t);
- v_tp3:=map(diff,r_tp3,t);
Вычисляем интеграл работы:
- Work1:=int(dotprod(subs(x=r_tp1[1],y=r_tp1[2],
z=r_tp1[3],F),v_tp1),t=0..1);
- Work2:=int(dotprod(subs(x=r_tp2[1],y=r_tp2[2],
z=r_tp2[3],F),v_tp2),t=0..1);
- Work3:=int(dotprod(subs(x=r_tp3[1],y=r_tp3[2],
z=r_tp3[3],F),v_tp3),t=0..1);
- evalf(Work1+Work2+Work3);
