Вы передаёте мета-описания функций, а не их реализации.
Делегат - это указатель на место в памяти процесса, по которому расположен тот или иной метод, который можно вызвать, если соблюдать соглашения, предписанные делегатом - количество и типы аргументов и возвращаемое значение.
В вашем случае реализаций мат. функций в памяти нет. Машина не знает, по какому адресу сделать вызов.
Вы должны написать реализации синуса, косинуса и пр. Только тогда вы сможете передавать функции для выполнения другому методу через делегат.
Вот простенький пример (реализация функций может быть и в отдельных методах):
delegate double mathfunc(double arg);
static void Main()
{
mathfunc sin = arg => Math.Sin(arg); // реализация синуса
mathfunc cos = arg => Math.Cos(arg); // реализация косинуса
var result_sin = DoMath(sin, Math.PI / 2); // передача адреса на реализацию синуса методу DoMath
var result_cos = DoMath(cos, Math.PI / 2);
}
// Метод, который выполняет вызов функции через делегат
static double DoMath(mathfunc function, double argument)
{
return function(argument);
}