Saya telah menulis fungsi di C # yang melakukan diferensiasi numerik. Ini terlihat seperti ini:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Saya ingin bisa meneruskan fungsi apa pun, seperti di:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Saya pikir ini mungkin dilakukan dengan delegasi (mungkin?) Tetapi saya tidak yakin bagaimana menggunakannya.
Bantuan apa pun akan sangat dihargai.
Jawaban:
Menggunakan Func seperti yang disebutkan di atas berfungsi, tetapi ada juga delegasi yang melakukan tugas yang sama dan juga menentukan maksud dalam penamaan:
public delegate double MyFunction(double x); public double Diff(double x, MyFunction f) { double h = 0.0000001; return (f(x + h) - f(x)) / h; } public double MyFunctionMethod(double x) { // Can add more complicated logic here return x + 10; } public void Client() { double result = Diff(1.234, x => x * 456.1234); double secondResult = Diff(2.345, MyFunctionMethod); }
sumber
Ada beberapa tipe umum dalam .Net (v2 dan yang lebih baru) yang membuat fungsi penerusan sebagai delegasi menjadi sangat mudah.
Untuk fungsi dengan tipe kembalian, ada Func <> dan untuk fungsi tanpa tipe kembalian ada Action <>.
Baik Func maupun Action dapat dideklarasikan untuk mengambil dari 0 hingga 4 parameter. Misalnya, Func <double, int> menggunakan satu double sebagai parameter dan mengembalikan sebuah int. Tindakan <double, double, double> menggunakan tiga double sebagai parameter dan tidak mengembalikan apa-apa (void).
Jadi Anda dapat mendeklarasikan fungsi Diff Anda untuk mengambil Func:
public double Diff(double x, Func<double, double> f) { double h = 0.0000001; return (f(x + h) - f(x)) / h; }
Dan kemudian Anda menyebutnya begitu, cukup beri nama fungsi yang sesuai dengan tanda tangan Func atau Action Anda:
double result = Diff(myValue, Function);
Anda bahkan dapat menulis fungsi sesuai dengan sintaks lambda:
double result = Diff(myValue, d => Math.Sqrt(d * 3.14));
sumber
Func
danAction
telah diperbarui untuk memungkinkan hingga 16 parameter.Func<double, double>
yang merupakan turunan pertama dari fungsi input, tentu saja dihitung secara numerik.return x => (f(x + h) - f(x)) / h;
Anda bahkan dapat menulis kelebihan beban yang mengembalikann
turunan ke - th dari fungsi masukan.public static T Runner<T>(Func<T> funcToRun) { //Do stuff before running function as normal return funcToRun(); }
Pemakaian:
var ReturnValue = Runner(() => GetUser(99));
sumber