2016-11-25 10 views
-3

私はすでにを計算する関数を持っていると考えて、x = |f(x) - f(x-1)|を計算する関数を書くでしょうか?x = | f(x)-f(x-1)|を計算するC#関数。

+2

' Math.Abs​​ようにそれを呼び出すための方法がが疑われますか? –

+0

'f(x)'が解析的に微分可能でない限り、2つの異なる引数で明示的に呼び出す必要があり、絶対値を取る必要がありますか?あなたはここでどんな魔法を望んでいたのですか? –

+0

fとは何か、fが1つの引数をとり、変数を返すメソッドであれば、これは簡単です! – hdrdiab

答えて

0

一般的なケース(我々は|f(x) - f(x-1)|を返しFunc<T, T>ラムダに変身したいFunc<T, T> fラムダを持っている)で、それは非常に興味深い問題です(大への感謝、質問へのコメントを参照)。のが楽しみましょう:みましょう、今

using System.Linq.Expressions; 
using System.Reflection; 

... 

public static partial class FuncExtensions { 
    public static Func<T, T> AbsDiff<T>(this Func<T, T> source) { 
    if (null == source) 
     throw new ArgumentNullException("source"); 

    var x = Expression.Parameter(typeof(T), "x"); 
    Expression<Func<T, T>> f = v => source(v); 
    MethodInfo abs = typeof(Math).GetMethod("Abs", new Type[] { typeof(T) }); 

    var one = Expression.Convert(Expression.Constant(1), typeof(T)); 

    var body = Expression.Call(abs, Expression.Subtract(
     Expression.Invoke(f, x), 
     Expression.Invoke(f, Expression.Subtract(x, one)))); 

    return Expression.Lambda(body, x).Compile() as Func<T, T>; 
} 

}

をテスト:

Func<double, double> f1 = x => x * x; 
    Func<int, int> f2 = x => x; 

    // |2*2 - 1*1| == 3 
    Console.WriteLine(f1.AbsDiff()(2).ToString()); 
    // |5 - 4| == 1 
    Console.WriteLine(f2.AbsDiff()(5).ToString()); 

P.S. ( - F(X - 1)f(x)が) `私はそれが何が実際にが質問に望んでいた、Math.Abs

var result = Math.Abs(f(x) - f(x - 1)); 
関連する問題