У меня есть тип значения, представляющий распределение по Гауссу:
struct Gauss {
double mean;
double variance;
}
Я хотел бы выполнить интеграл по ряду этих значений:
Gauss eulerIntegrate(double dt, Gauss iv, Gauss[] values) {
Gauss r = iv;
foreach (Gauss v in values) {
r += v*dt;
}
return r;
}
У меня вопрос, как реализовать сложение для этих нормальных дистрибутивов.
Умножение на скаляр (dt
) казалось достаточно простым. Но это было не просто! Спасибо FOOSHNICK за помощь:
public static Gauss operator * (Gauss g, double d) {
return new Gauss(g.mean * d, g.variance * d * d);
}
Однако сложение ускользает от меня. Я полагаю, я могу просто добавить средства; это дисперсия вызывает у меня проблемы. Любое из этих определений мне кажется "логичным".
public static Gauss operator + (Gauss a, Gauss b) {
double mean = a.mean + b.mean;
// Is it this? (Yes, it is!)
return new Gauss(mean, a.variance + b.variance);
// Or this? (nope)
//return new Gauss(mean, Math.Max(a.variance, b.variance));
// Or how about this? (nope)
//return new Gauss(mean, (a.variance + b.variance)/2);
}
Может ли кто-нибудь помочь определить статистически правильную или хотя бы «разумную» версию оператора +
?
Полагаю, я мог бы вместо этого переключить код на использование интервальной арифметики, но я надеялся остаться в мире вероятностей и статистики.