Pull to refresh
131
13.1

Пользователь

Send message

Придумал сделать так. Wk/k-1 сделать единичной в матрице Hk. Это даст Bпоказаний=Bистинное*I+Bистинное*Wk/k-1+Vk (здесь Wk/k-1 - элементы матрицы Xk/k-1!). То есть, показания есть истинные показания+смещённые от истинных за счёт магнитомягких материалов+смещения нуля. Тогда фильтр подбирает эти самые смещения (Wk/k-1 и Vk). Тогда чтобы получить истинный результат из показаний прибора, нужно Bистинное=(Wk+I)^-1x(Bпоказаний-Vk). Вроде бы работает (пока без имитации магнитомягких материалов). До этого вообще не сходился никак. Завтра добавлю имитацию магнитомягких материалов и проверю точнее.

Основной фрагмент кода
#ifndef C_FILTER_KALMAN_SOFT_AND_HARD_IRON_H
#define C_FILTER_KALMAN_SOFT_AND_HARD_IRON_H

//****************************************************************************************************
//Класс фильтра Калмана для магнитомягких и магнитотвёрдых материалов
//****************************************************************************************************

//****************************************************************************************************
//подключаемые библиотеки
//****************************************************************************************************

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#include "cvector.h"
#include "cmatrix.h"

//****************************************************************************************************
//макроопределения
//****************************************************************************************************

//****************************************************************************************************
//константы
//****************************************************************************************************

//****************************************************************************************************
//предварительные объявления
//****************************************************************************************************


//****************************************************************************************************
//прототипы функций
//****************************************************************************************************


//****************************************************************************************************
//Класс фильтра Калмана для магнитомягких и магнитотвёрдых материалов
//****************************************************************************************************

class CFilterKalman_SoftAndHardIron
{
 public:
  //-перечисления---------------------------------------------------------------------------------------
  //-структуры------------------------------------------------------------------------------------------
  //элементы фильтра Калмана
  struct SKalman
  {
   CMatrix Xk_1;//вектор состояния
   CMatrix Pk_1;//матрица ковариации
   CMatrix Rk_1;//матрица ориентации

   CMatrix Xk;//новый вектор состояния
   CMatrix Pk;//новая матрица ковариации
   CMatrix Rk;//новая матрица ориентации

   CMatrix F;//матрица динамики
   CMatrix dR;//матрица изменения ориентации
   CMatrix H;//матрица
   CMatrix Y;//матрица
   CMatrix X;//матрица
   CMatrix P;//матрица
   CMatrix M;//матрица
   CMatrix S;//матрица
   CMatrix K;//матрица коэффициента усиления фильтра Калмана
   CMatrix Identity;//единичная матрица

   bool FirstStep;//первый ли шаг
  };

  //список параметров для фильтра Калмана
  struct SKalmanParam
  {
   //интервал времени
   float dT;
   //углы ориентации в пространстве
   float Roll;
   float Pitch;
   float Yaw;
   //магнитометры
   float Mx;
   float My;
   float Mz;
  };
  //показания магнитометров
  struct SMeasure
  {
   float Mx;
   float My;
   float Mz;
  };

  //-константы------------------------------------------------------------------------------------------
 private:
  //-переменные-----------------------------------------------------------------------------------------
  SKalman sKalman;//параметры фильтра Калмана
 public:
  //-конструктор----------------------------------------------------------------------------------------
  CFilterKalman_SoftAndHardIron(void);
  //-деструктор-----------------------------------------------------------------------------------------
  ~CFilterKalman_SoftAndHardIron();
 public:
  //-открытые функции-----------------------------------------------------------------------------------
  void Init(void);//инициализация фильтра
  void Procesing(const SKalmanParam &sKalmanParam);//обработка фильтра
  CMatrix GetState(void);//получить результаты работы фильтра
  SMeasure Correction(const SMeasure sMeasure_Input);//скоррекировать показания магнитометров
 private:
  //-закрытые функции-----------------------------------------------------------------------------------
};

#endif




//****************************************************************************************************
//подключаемые библиотеки
//****************************************************************************************************
#include "cfilterkalman_softandhardiron.h"

//****************************************************************************************************
//глобальные переменные
//****************************************************************************************************

//****************************************************************************************************
//константы
//****************************************************************************************************

static const double M_PI_VALUE=3.141592653589793238462643383279;

//****************************************************************************************************
//макроопределения
//****************************************************************************************************

//****************************************************************************************************
//конструктор и деструктор
//****************************************************************************************************

//----------------------------------------------------------------------------------------------------
//конструктор
//----------------------------------------------------------------------------------------------------
CFilterKalman_SoftAndHardIron::CFilterKalman_SoftAndHardIron(void)
{
}
//----------------------------------------------------------------------------------------------------
//деструктор
//----------------------------------------------------------------------------------------------------
CFilterKalman_SoftAndHardIron::~CFilterKalman_SoftAndHardIron()
{
}
//****************************************************************************************************
//закрытые функции
//****************************************************************************************************

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


//****************************************************************************************************
//открытые функции
//****************************************************************************************************

//----------------------------------------------------------------------------------------------------
//инициализация фильтра
//----------------------------------------------------------------------------------------------------
void CFilterKalman_SoftAndHardIron::Init(void)
{
 sKalman.Xk_1=CMatrix(12,1);

 sKalman.Pk_1=CMatrix(12,12);
 sKalman.Pk_1.Unitary();

 sKalman.Rk_1=CMatrix(3,3);
 sKalman.Rk_1.Unitary();


 sKalman.Xk=CMatrix(12,1);

 sKalman.Pk=CMatrix(12,12);
 sKalman.Pk.Unitary();

 sKalman.Rk=CMatrix(3,3);
 sKalman.Rk.Unitary();


 sKalman.P=CMatrix(12,12);
 sKalman.X=CMatrix(12,1);
 sKalman.F=CMatrix(12,12);
 sKalman.dR=CMatrix(3,3);
 sKalman.H=CMatrix(3,12);
 sKalman.Y=CMatrix(3,1);
 sKalman.M=CMatrix(3,1);
 sKalman.S=CMatrix(3,3);
 sKalman.Identity=CMatrix(12,12);
 sKalman.Identity.Unitary();

 sKalman.FirstStep=true;
}

//----------------------------------------------------------------------------------------------------
//обработка фильтра
//----------------------------------------------------------------------------------------------------
void CFilterKalman_SoftAndHardIron::Procesing(const SKalmanParam &sKalmanParam)
{
 //применяем фильтр Калмана

 //матрица вращения из статьи "МЭМС акселерометры, магнитометры и углы ориентации"

 float cr=cos(M_PI_VALUE/180.0*sKalmanParam.Roll);
 float sr=sin(M_PI_VALUE/180.0*sKalmanParam.Roll);

 float cp=cos(M_PI_VALUE/180.0*sKalmanParam.Pitch);
 float sp=sin(M_PI_VALUE/180.0*sKalmanParam.Pitch);

 float cy=cos(M_PI_VALUE/180.0*sKalmanParam.Yaw);
 float sy=sin(M_PI_VALUE/180.0*sKalmanParam.Yaw);

 sKalman.Rk.SetElement(0,0,cy*cp);
 sKalman.Rk.SetElement(0,1,-cr*sy+sr*cy*sp);
 sKalman.Rk.SetElement(0,2,sr*sy+cr*cy*sp);

 sKalman.Rk.SetElement(1,0,sy*cp);
 sKalman.Rk.SetElement(1,1,cr*cy+sr*sy*sp);
 sKalman.Rk.SetElement(1,2,-sr*cy+cr*sy*sp);

 sKalman.Rk.SetElement(2,0,-sp);
 sKalman.Rk.SetElement(2,1,sr*cp);
 sKalman.Rk.SetElement(2,2,cr*cp);

 if (sKalman.FirstStep==true)
 {
  sKalman.FirstStep=false;
  double xk_1[12]={sKalmanParam.Mx,sKalmanParam.My,sKalmanParam.Mz,1,1,1,0,0,0,0,0,0};//показания, матрица вращения магнитомягких материалов и смещения показаний
  sKalman.Xk_1.SetElement(xk_1,12);
  sKalman.Rk_1=sKalman.Rk;
  sKalman.Pk_1.Unitary();
 }

 sKalman.dR=sKalman.Rk.Transpose()*sKalman.Rk_1;

 //матрица динамики
 sKalman.F.SetElement(0,0,sKalman.dR.GetElement(0,0));
 sKalman.F.SetElement(0,1,sKalman.dR.GetElement(0,1));
 sKalman.F.SetElement(0,2,sKalman.dR.GetElement(0,2));

 sKalman.F.SetElement(1,0,sKalman.dR.GetElement(1,0));
 sKalman.F.SetElement(1,1,sKalman.dR.GetElement(1,1));
 sKalman.F.SetElement(1,2,sKalman.dR.GetElement(1,2));

 sKalman.F.SetElement(2,0,sKalman.dR.GetElement(2,0));
 sKalman.F.SetElement(2,1,sKalman.dR.GetElement(2,1));
 sKalman.F.SetElement(2,2,sKalman.dR.GetElement(2,2));


 sKalman.F.SetElement(0,3,0);
 sKalman.F.SetElement(0,4,0);
 sKalman.F.SetElement(0,5,0);
 sKalman.F.SetElement(0,6,0);
 sKalman.F.SetElement(0,7,0);
 sKalman.F.SetElement(0,8,0);
 sKalman.F.SetElement(0,9,0);
 sKalman.F.SetElement(0,10,0);
 sKalman.F.SetElement(0,11,0);

 sKalman.F.SetElement(1,3,0);
 sKalman.F.SetElement(1,4,0);
 sKalman.F.SetElement(1,5,0);
 sKalman.F.SetElement(1,6,0);
 sKalman.F.SetElement(1,7,0);
 sKalman.F.SetElement(1,8,0);
 sKalman.F.SetElement(1,9,0);
 sKalman.F.SetElement(1,10,0);
 sKalman.F.SetElement(1,11,0);

 sKalman.F.SetElement(2,3,0);
 sKalman.F.SetElement(2,4,0);
 sKalman.F.SetElement(2,5,0);
 sKalman.F.SetElement(2,6,0);
 sKalman.F.SetElement(2,7,0);
 sKalman.F.SetElement(2,8,0);
 sKalman.F.SetElement(2,9,0);
 sKalman.F.SetElement(2,10,0);
 sKalman.F.SetElement(2,11,0);


 sKalman.F.SetElement(3,0,0);
 sKalman.F.SetElement(3,1,0);
 sKalman.F.SetElement(3,2,0);

 sKalman.F.SetElement(4,0,0);
 sKalman.F.SetElement(4,1,0);
 sKalman.F.SetElement(4,2,0);

 sKalman.F.SetElement(5,0,0);
 sKalman.F.SetElement(5,1,0);
 sKalman.F.SetElement(5,2,0);

 sKalman.F.SetElement(6,0,0);
 sKalman.F.SetElement(6,1,0);
 sKalman.F.SetElement(6,2,0);

 sKalman.F.SetElement(7,0,0);
 sKalman.F.SetElement(7,1,0);
 sKalman.F.SetElement(7,2,0);

 sKalman.F.SetElement(8,0,0);
 sKalman.F.SetElement(8,1,0);
 sKalman.F.SetElement(8,2,0);

 sKalman.F.SetElement(9,0,0);
 sKalman.F.SetElement(9,1,0);
 sKalman.F.SetElement(9,2,0);

 sKalman.F.SetElement(10,0,0);
 sKalman.F.SetElement(10,1,0);
 sKalman.F.SetElement(10,2,0);

 sKalman.F.SetElement(11,0,0);
 sKalman.F.SetElement(11,1,0);
 sKalman.F.SetElement(11,2,0);



 sKalman.F.SetElement(3,3,1);
 sKalman.F.SetElement(3,4,0);
 sKalman.F.SetElement(3,5,0);
 sKalman.F.SetElement(3,6,0);
 sKalman.F.SetElement(3,7,0);
 sKalman.F.SetElement(3,8,0);
 sKalman.F.SetElement(3,9,0);
 sKalman.F.SetElement(3,10,0);
 sKalman.F.SetElement(3,11,0);

 sKalman.F.SetElement(4,3,0);
 sKalman.F.SetElement(4,4,1);
 sKalman.F.SetElement(4,5,0);
 sKalman.F.SetElement(4,6,0);
 sKalman.F.SetElement(4,7,0);
 sKalman.F.SetElement(4,8,0);
 sKalman.F.SetElement(4,9,0);
 sKalman.F.SetElement(4,10,0);
 sKalman.F.SetElement(4,11,0);

 sKalman.F.SetElement(5,3,0);
 sKalman.F.SetElement(5,4,0);
 sKalman.F.SetElement(5,5,1);
 sKalman.F.SetElement(5,6,0);
 sKalman.F.SetElement(5,7,0);
 sKalman.F.SetElement(5,8,0);
 sKalman.F.SetElement(5,9,0);
 sKalman.F.SetElement(5,10,0);
 sKalman.F.SetElement(5,11,0);

 sKalman.F.SetElement(6,3,0);
 sKalman.F.SetElement(6,4,0);
 sKalman.F.SetElement(6,5,0);
 sKalman.F.SetElement(6,6,1);
 sKalman.F.SetElement(6,7,0);
 sKalman.F.SetElement(6,8,0);
 sKalman.F.SetElement(6,9,0);
 sKalman.F.SetElement(6,10,0);
 sKalman.F.SetElement(6,11,0);

 sKalman.F.SetElement(7,3,0);
 sKalman.F.SetElement(7,4,0);
 sKalman.F.SetElement(7,5,0);
 sKalman.F.SetElement(7,6,0);
 sKalman.F.SetElement(7,7,1);
 sKalman.F.SetElement(7,8,0);
 sKalman.F.SetElement(7,9,0);
 sKalman.F.SetElement(7,10,0);
 sKalman.F.SetElement(7,11,0);

 sKalman.F.SetElement(8,3,0);
 sKalman.F.SetElement(8,4,0);
 sKalman.F.SetElement(8,5,0);
 sKalman.F.SetElement(8,6,0);
 sKalman.F.SetElement(8,7,0);
 sKalman.F.SetElement(8,8,1);
 sKalman.F.SetElement(8,9,0);
 sKalman.F.SetElement(8,10,0);
 sKalman.F.SetElement(8,11,0);

 sKalman.F.SetElement(9,3,0);
 sKalman.F.SetElement(9,4,0);
 sKalman.F.SetElement(9,5,0);
 sKalman.F.SetElement(9,6,0);
 sKalman.F.SetElement(9,7,0);
 sKalman.F.SetElement(9,8,0);
 sKalman.F.SetElement(9,9,1);
 sKalman.F.SetElement(9,10,0);
 sKalman.F.SetElement(9,11,0);

 sKalman.F.SetElement(10,3,0);
 sKalman.F.SetElement(10,4,0);
 sKalman.F.SetElement(10,5,0);
 sKalman.F.SetElement(10,6,0);
 sKalman.F.SetElement(10,7,0);
 sKalman.F.SetElement(10,8,0);
 sKalman.F.SetElement(10,9,0);
 sKalman.F.SetElement(10,10,1);
 sKalman.F.SetElement(10,11,0);

 sKalman.F.SetElement(11,3,0);
 sKalman.F.SetElement(11,4,0);
 sKalman.F.SetElement(11,5,0);
 sKalman.F.SetElement(11,6,0);
 sKalman.F.SetElement(11,7,0);
 sKalman.F.SetElement(11,8,0);
 sKalman.F.SetElement(11,9,0);
 sKalman.F.SetElement(11,10,0);
 sKalman.F.SetElement(11,11,1);

 //этап предсказания
 sKalman.X=sKalman.F*sKalman.Xk_1;//предсказанное значение
 sKalman.P=(sKalman.F*sKalman.Pk_1)*(sKalman.F.Transpose());//+Q (пока не понимаю, где взять ковариацию внешнего воздействия)

 //этап корректировки
 double mx=sKalman.X.GetElement(0,0);
 double my=sKalman.X.GetElement(1,0);
 double mz=sKalman.X.GetElement(2,0);

 double w11=1;//sKalman.X.GetElement(3,0);
 double w22=1;//sKalman.X.GetElement(4,0);
 double w33=1;//sKalman.X.GetElement(5,0);
 double w12=0;//sKalman.X.GetElement(6,0);
 double w13=0;//sKalman.X.GetElement(7,0);
 double w23=0;//sKalman.X.GetElement(8,0);

 double h_item[12*3]={w11,w12,w13,   mx,0,0, my,mz,0,  1,0,0,
                      w12,w22,w23,   0,my,0, mx,0,mz,  0,1,0,
                      w13,w23,w33,   0,0,mz, 0,mx,my,  0,0,1};

 sKalman.H.SetElement(h_item,12*3);

 sKalman.M.SetElement(0,0,sKalmanParam.Mx);
 sKalman.M.SetElement(1,0,sKalmanParam.My);
 sKalman.M.SetElement(2,0,sKalmanParam.Mz);

 sKalman.Y=sKalman.M-sKalman.H*sKalman.X;

 sKalman.S=(sKalman.H*sKalman.P)*(sKalman.H.Transpose())+sKalman.Rk;

 sKalman.K=(sKalman.P*sKalman.H.Transpose())*(sKalman.S.GetInversion());

 sKalman.Xk=sKalman.X+sKalman.K*sKalman.Y;
 sKalman.Pk=(sKalman.Identity-sKalman.K*sKalman.H)*sKalman.P;

 sKalman.Xk_1=sKalman.Xk;
 sKalman.Pk_1=sKalman.Pk;
 sKalman.Rk_1=sKalman.Rk;

 //в коэффициентах Xk получаются смещения и элементы матрицы вращения

}
//----------------------------------------------------------------------------------------------------
//получить результаты работы фильтра
//----------------------------------------------------------------------------------------------------
CMatrix CFilterKalman_SoftAndHardIron::GetState(void)
{
 return(sKalman.Xk);
}

//----------------------------------------------------------------------------------------------------
//скоррекировать показания магнитометров
//----------------------------------------------------------------------------------------------------
CFilterKalman_SoftAndHardIron::SMeasure CFilterKalman_SoftAndHardIron::Correction(const SMeasure sMeasure_Input)
{
 double mx=sMeasure_Input.Mx;
 double my=sMeasure_Input.My;
 double mz=sMeasure_Input.Mz;
 //матрица влияния магнитомягких материалов
 double w11=sKalman.Xk.GetElement(3,0)+1;//прибавляем единичную матрицу, чтобы учесть сами показания
 double w22=sKalman.Xk.GetElement(4,0)+1;//прибавляем единичную матрицу, чтобы учесть сами показания
 double w33=sKalman.Xk.GetElement(5,0)+1;//прибавляем единичную матрицу, чтобы учесть сами показания
 double w12=sKalman.Xk.GetElement(6,0);
 double w13=sKalman.Xk.GetElement(7,0);
 double w23=sKalman.Xk.GetElement(8,0);
 //смещения нуля
 double bx=sKalman.Xk.GetElement(9,0);
 double by=sKalman.Xk.GetElement(10,0);
 double bz=sKalman.Xk.GetElement(11,0);

 CMatrix w(3,3);
 double w_item[3*3]={w11,w12,w13,
                     w12,w22,w23,
                     w13,w23,w33};
 w.SetElement(w_item,3*3);
 //матрица влияния магнитомягких материалов (обратная)
 CMatrix w_inv=w.GetInversion();

 CMatrix x(3,1);

 x.SetElement(0,0,mx-bx);
 x.SetElement(1,0,my-by);
 x.SetElement(2,0,mz-bz);

 CMatrix y(3,1);
 y=w_inv*x;

 SMeasure sMeasure;
 sMeasure.Mx=y.GetElement(0,0);
 sMeasure.My=y.GetElement(1,0);
 sMeasure.Mz=y.GetElement(2,0);

 return(sMeasure);
}

Пробую сделать фильтр с компенсацией магнитомягких материалов.

Вот тут есть статья: https://iopscience.iop.org/article/10.1088/1742-6596/1627/1/012028/pdf

В чём проблема? Вот тут есть вектор состояния Xk. В него входят показания магнитометров (Bc,kT), шесть элементов матрицы компенсации магнитомягких материалов (она симметричная) Wk и вектор смещений показаний магнитометров Vk.

Здесь получается прогнозный вектор состояния Xk/k-1. И всё бы ничего, но вот взаимосвязь Xk/k-1 с показаниями реального магнитометра осуществляется через матрицу Hk.

А она делается так:

л
л

И вот тут непонятно. Wk/k-1 - это элементы матрицы Xk/k-1? Но тогда получается, что H*Xk/k-1 - показания реального магнитометра - получается после раскрытия выражения как Wk/k-1xBc,kT+Wk/k-1*Bc,kT+Vk !!! То есть, тут по сути-то 2*Wk/k-1xBc,kT-V. И фильтр нихрена не сходится. И что это за физическая компенсация магнитомягкого материала такая? Где-то ошибка в матрице Hk у меня. Но где? Что я неверно сделал?

Отвечу сам себе. Матрицу Q выбросил. А матрицу R взял отсюда. https://habr.com/ru/articles/491476/

Я-то статью читал. Только вот фрагмента

Уже из этого ограничения вытекают проблемы. Кажется что 1/60 секунды - это довольно маленькое время (17 миллисекунд, если быть точным), однако в мире физики может случиться многое. Например, пуля, летящая сквозь тонкую стенку. Один кадр она с одной стороны стенки, а следующий кадр уже с другой. С точки зрения дискретной физики между ними не было контакта и пуля летит дальше.

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

я там не припомню. Стало быть, автор добавил апостериорно после моего вопроса.

Теперь, когда тела заняли свои новые позиции, нужно проверить не столкнулись ли они.

А как быть, если объект, например, пуля. И за 1/60 на позициях пули ни до, ни после интервала времени столкновения как бы и нет. Но в промежутке-то оно было - там стена стоит.

Ряд тейлора вроде как многие (МК-85, например) советские калькуляторы (кроме производства "Светлана" - те использовали CORDIC).

Для трёхуровневой схемы рубина требуется большая накачка. Мощность накачки указанного здесь рубинового лазера 1000 Дж/3 мс = 300 кВт. Если светодиоды смогут обеспечить такую накачку, то всё получится. А так, расчёт для неодимового АЭ есть тут. Если пересчитать на рубин, то можно узнать требования к светодиодам.

Да, совсем забыл, вишенка на торте – стоимость ОК составила 700 (семьсот) рублей за штуку в партии в 500 штук.

Это с какой приёмкой?

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

Например, по первой для прямой свёртки. Есть картинка размерностью [Ix,Iy,Iz]. Сворачиваем её N ядрами размерностью [Kx,Ky,Kz], при этом должно быть Iz=Kz. Чтобы такую свёртку сделать, нужно сделать умножение двух матриц. Первая - матрица ядер, она собирается по X как компоненты тензора каждого ядра. По Y такая матрица имеет размерность количества ядер. Вторая матрица - матрица изображения. Она собирается по X и Y как элементы изображения, для которых будут применяться ядра (так как ядра размерности Kz=Iz, то вертикаль делается для всех размерностей). Так как умножение матриц строка на столбец, это даёт ту самую свёртку.

А умножение матриц используется потому что эта операция очень хорошо оптимизирована для той же CUDA.

А что вы берёте в качестве матрицы Q? Или вы её игнорируете?

И как вы описываете матрицу вращения R? Точнее, как вы её связываете с показаниями гироскопов?

Вдруг кому пригодится.

Вот свёртка через умножение матриц.

Обновление коэффициентов ядер свёртки (для нейросетей).

Только не надо строить эти матрицы заранее. Их легко можно (и нужно!) строить прямо «на лету».
А вот так выглядит свёртка RGB-изображений нагрядно:

Здесь вверху показан прямой проход по сети (Image сворачивается с ядрами
Kernel и получается тензор свёртки, с глубиной равной количеству ядер).

В середине показан процесс вычисления поправок к элементам ядер, зная ошибку (Delta).
Ну а внизу показан процесс вычисления ошибок при обратном проходе через
свёрточный слой. Тут Delta предыдущего слоя сворачивается с повернутыми
на 180  ядрами.

Техника-Молодёжи. Примерно 1996-1997 года.

Нате вам ещё в копилку.

Лучше сделайте другое. Разделите луч лазера на два луча. В один луч поставьте активный элемент лазера, но пока не накачивайте его. На некотором расстоянии поставьте в каждый луч детектор. Согласуйте оптическую длину пути обоих лучей до детекторов. Теперь оба луча приходят одновременно в детекторы. Отлично. А теперь включаем накачку. :) И видим, что луч, прошедший через активную среду приходит быстрее луча, который двигался без препятствий. То есть, он двигался быстрее скорости света. :)

Этот эксперимент был описан в "Н.Г.Басов, Р.В.Амбарцумян, В.С.Зуев, и др. ЖЭТФ, 50, 1 (1966) 23. ".

А объясняется он уплотнением фронтов импульса.

Так ведь сейчас не 2006 и не 2008 год. Для тех лет проблемы только начинались. А в 2020 уже приходящие в ФизТех имени Иоффе выпускники этой кафедры поражали сотрудников вот тем самым "ух ты, транзистор!". А на полученное образование никогда никто не жалуется, коли не с чем сравнивать.

Я вам приведу один пример:

Интересно, что из всего университета ярко запомнились в основном именно
преподаватели каф. МЭ и буквально один или два преподавателя других
кафедр.

Я думаю, квантмех у вас вёл курсе эдак на третьем с очень высокой вероятностью Соколов Александр Иванович? Да, он замечательный лектор. Но есть нюанс. Его курс адаптирован (да-да, он знает намного больше, но не рассказывает студентам ЛЭТИ) для ЛЭТИ. Даже для его родной кафедры КЭОП его курс вообще ни в какое сравнение не пойдёт с курсом того же учебника Фейнмана 70-х годов. В результате что вам известно про нотацию Дирака (Важнейшая вещь! Всё записывается именно в ней! Без неё в квантмех можно даже не соваться.) в квантмехе? Ничего. Спиноры? Ничего практически (один раз было). Теорема Белла? Ничего. Про различные интерпретации соотношений неопределённости Гейзенберга? Ничего (и почему-то для нас было сообщено о влиянии наблюдателя, хотя это свойство от наблюдателя не зависит). Про вывод этого соотношения из коммутатора (уже забыл, из него ли) операторов? Ничего. А зоны Брюэллена вы хорошо себе представляете? Вряд ли. Про них только немного рассказали. А почему гелий сверхтекучий? Некуда энергию тратить в фазе конденсата Бозе-Эйнштейна? А другим материалам куда её тратить, коли все нижележащие уровни заняты, а у нас статистика Ферми-Дирака не позволяет их занять? Очень поверхностые знания получаются и без детальной проработки. Как лоскутное одеяло. Простите, но это точно те знания, которые я, например, ожидал на профильной кафедре? А почему в той же квантовой электронике не рассказали про то, что такое вынужденное рассеяние Мандельштама-Брюэллена? Это важнейшая тема! А нелинейная оптика? Генерация гармоник? Где все эти курсы? Я-то учился на КЭОП. Где оно всё? А типы рассеяния (Рэлея, Рамана, Томпсона там всякие)? Почему про них в курсах оптики нет ни слова? Да хоть в общем курсе физики хоть кто-нибудь объяснил чем СГС от СИ отличается? Как так вышло, что индукция электрического поля в СГС в размерности совпадает с полем (В/м), а в СИ - нет. Почему? Вот почему в СИ D=E*epsilon и D имеет размерность дипольного момента единицы объёма? А в СГС D это те же вольты на метр? Откуда в законе Кулона 1/(2*ПИ)? В СГС этого нет. Так это вообще основа! А то, что определитель есть ориентированный объём фигуры вам говорили в курсах математики? Ручаюсь, что забыли. Но почему это есть в старых учебниках, но нет в институтском курсе ЛЭТИ? Разве можно вот такое лоскутное образование (тут недосказанность, там просто поверьте, а ещё там нюансы забыли растолковать) считать хорошим? Формул-то накатали в курсах много (и все благополучно забылись, да), но суть концепций, целостность и связность в курсах потеряны.

Вот потому-то жаловаться будет только тот, кто внезапно увидел, сколько не дали.

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

А это они индекс Хирша поднимают. Вероятно, есть надбавки за него.

Не за что. Я так-то тоже выпускник ЛЭТИ, факультета ФЭЛ, но 2006 года. И там уже были проблемы с целостностью программ курсов (знаете, как нас электродинамике на кафедре учили? "А вот трава зелёная... Это электродинамика!". Я не шучу. За весь семестр 1.5 формулы и байки и рассказы. Препод по лабораторным по квантмеху вообще ни разу не пришёл за несколько месяцев - он бухал. Потом нам его заменили всё-таки.). Упомянутая кафедра была на том же факультете ФЭЛ, но про наноэлектронику ещё не знала. А вот то, куда дальше скатился ЛЭТИ мы увидели по выпускникам (да, у моей конторы с ЛЭТИ и ИТМО совместное времяпровождение на почве имитации научной деятельности). Кстати, по самой статье есть вопросы. "микроскопическая капля сплава индия с галлием," - там барьер Шоттки не образуется у них, влияющий на ВАХ? А то мало ли... А ещё эти металлы отлично растворяют.

кафедры микро и наноэлектроники СПбГЭТУ «ЛЭТИ»

А, это та кафедра, сегодняшние выпускники которой не могут объяснить, как работают биполярные и полевые транзисторы и даже не могут вспомнить, как называются выводы транзисторов (те, что затвор, исток, сток и эмиттер, база, коллектор). В ФизТех'е когда с такими выпускниками столкнулись, были поражены. А так - установка просто станок с ЧПУ с тонким электродом. Собственно, из статьи не понятно, что в этом революционного. Капелька на конце иглы зонда?

Information

Rating
435-th
Location
Санкт-Петербург и область, Россия
Registered
Activity