Здравствуйте. Мне было дано задание написать программу для обсчёта эквивалентной схемы, состоящей из множества сопротивлений и ёмкостей. На входе схемы - идеализированный источник тока, который может работать в двух режимах: первый - постоянный ток, и второй - прямоугольные импульсы (меандр). Математическое описание этой эквивалентной схемы дало матрицу 11 на 12. (11 различных величин токов, 6 уравнений узлов и 5 уравнений контуров, и столбец свободных членов). Искомый выходной ток - частное двух определителей (матрицы с заменой столбца искомого тока на столбец свободных членов, и "чистой" исходной матрицы). В дальнейшем этот ток умножается на сопротивление выходного элемента, через который он течёт, и так находится выходное напряжение. В общем случае такой определитель имеет около 40 миллионов слагаемых, но, так как в исходных матрицах большое количество нулей, ненулевых слагаемых остаётся довольно мало. Я написал вспомогательную программу, которая нашла и выписала эти ненулевые слагаемые-перестановки. Для определителя-числителя таких оказалось всего 18, для определителя-знаменателя 209. Так что я в готовом виде, как таблицу записал эти определители в программу. Первый вариант этой программы был для обсчёта отклика (регистрируемого на выходе напряжения) при постоянном токе источника на входе. Так как ток постоянный, ёмкости можно было не учитывать, и все элементы в матрицах были обычными сопротивлениями. Результат вычислений этой программы дал хорошее совпадение с экспериментальными данными.
Но дальше надо было сделать вариант для импульсного источника входного тока. Идея была в том, чтобы:
1. разложить входной ток-меандр на сумму синусоидальных гармоник и постоянной составляющей;
2. заменить в определителях вещественные сопротивления комплексными, и вычислить их для каждой гармоники;
3. для каждой гармоники поделить один определитель на другой, получив безразмерный комплексный коэффициент проводимости;
4. умножить этот коэффициент на соответствующую гармонику входного тока, и сопротивление выходного элемента, получив таким образом гармоническую составляющую выходного напряжения;
5. сложить все эти гармонические составляющие выходного тока;
6. сделать такие же вычисления для постоянной составляющей, и сложить результат с ранее полученной суммой гармоник.
Я написал такую программу. Однако её результаты работы дали явно неправильный результат. В области заднего фронта импульсов наблюдаются большие выбросы, которых нет и в эксперименте, и логически понятно, что их там не должно быть. Выглядит это примерно так (нахожусь сейчас дома, и не могу привести реальный график, построенный в Excel):
Это тем более странно, что разложение входного тока-меандра выглядит совершенно нормально:
Количество гармоник в обоих случаях одинаково (47). Скажите, кто-нибудь сталкивался с чем-то подобным, в чём может быть причина? В случае, если в исходных данных все ёмкости задать нулевыми, форма выходного сигнала становится точно такой же, как у входного, как и должно быть для сети из чисто активных сопротивлений. Есть у меня подозрение, что всё это связано с ограниченной точностью компьютерных вычислений. Хотя я все числа в программе брал в формате long double, чтобы считало с максимально возможной точностью.
Во-первых, для высших гармоник даже маленькая неточность в вычислении начальной фазы может дать большое отклонение в "мгновенном" значении в точке, удалённой от нуля. Во-вторых, при вычислении определителей выполняется большое число арифметических операций (1254 для каждого определителя-знаменателя и 108 для каждого определителя-числителя), и тоже возможно накопление погрешности. И если знаменатель оказывается мал по сравнению с числителем, влияние этой погрешности тем более возрастает. В-третьих, операции над комплексными числами я производил "как есть", используя перегруженные арифметические операторы, а не преобразовывая, например, комплексные числа для умножения в экспоненциальную форму. Понятно, что в идеале это всё эквивалентно, но это в идеале, а как на самом деле реализован алгоритм умножения в компиляторе, не известно. Может быть, с преобразованием в экспоненциачльную форму считало бы точнее.
Вот такие мои предположения. Но я не математик, может быть, вы знаете ещё какие-нибудь, чисто математические, причины этого расхождения, не связанные с конечной точностью компьютерных вычислений?