У меня есть тип значения, представляющий распределение Гаусса:
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);
}
Может ли кто-нибудь помочь определить статистически правильную или, по крайней мере, «разумную» версию оператора +
?
Я полагаю, что мог бы вместо этого переключить код на использование интервальной арифметики, но я надеялся остаться в мире проб и статистики.