0

ウィキペディアでこれを見ました:高次方程式の一般化

実装しようとしたときの私のコード:

function generalSmoothStep(a, x) { //Generalized smoothstep
  var result = 0;
  for (var n = 0; n < a - 1; n ++) {
    result += binom(-a, n) * binom(2 * a - 1, a - n - 1) * Math.pow(x, a + n);
  }
  return result;
}

function smoothStep(x) { //Normal smoothstep
  return -2 * Math.pow(x, 3) + 3 * Math.pow(x, 2);
  //I know about x * x * (3 - 2 * x);
}

function binom(a, b) { //Binomial coefficient
  return Math.factorial(a) / (Math.factorial(a-b) *  Math.factorial(b));
}

Math.factorial = function(value) { //Factorial
  var result = 1;
  if (value > 0) {
    for (var count = 1; count <= value; count ++) {
      result *= count;
    }
  } else if (value < 0) {
    for (var count = -1; count >= value; count --) {
      result *= count;
    }
  } else {
    result = 1;
  }
  return result;
};

document.getElementById("normalStep").innerHTML = "smoothStep(0.2) = " + smoothStep(0.2);
document.getElementById("generalStep").innerHTML = "generalSmoothStep(2, 0.2) = " + generalSmoothStep(2, 0.2);
<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML"></script>
  <script>
    MathJax.Hub.Config({
      tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
    });
  </script>
</head>

<body>
  <p>The function: $\operatorname{S}_a(x) = \sum_{n=0}^{a-1} \binom{-a}{n}\binom{2a - 1}{a - n - 1}x^{a + n}$</p>
  
  <p>Here is the result when I run:</p>
  
  <p id="normalStep"></p>
  <p id="generalStep"></p>
</body>

二項係数と階乗については知っていますが、階乗は負の数で使用できないという問題があるため、トリックを使用してバイパスしようとしましたが、失敗しました...

また、 ()() が連鎖している部分は、上記のように binom 間の乗算 ()*() と x^(a+n) の乗算だと思いますが、それでも機能しません。

「一般的なスムーズなステップ」、「スムーズなステップの合計」などの単語でグーグルを使用しましたが、それでもそれについての良い説明は返されません...

私のコードが機能しない理由と、Javascriptで一般的なsmoothStep関数を実装する方法を知っている人は誰でも

4

2 に答える 2

0

負の二項係数を、正の数を使用するバリアントに置き換えることができます。ウィキペディアの別の記事で説明されている負の二項係数の一般化に基づいて、正の二項係数を使用したスムーズステップ方程式は次のようになります。

正の多項式を使用した Smoothstep

したがって、結果のコードは次のようになります。

function generalSmoothStep(a, x) { //Generalized smoothstep
  var result = 0;
  for (var n = 0; n <= a - 1; n ++) {
    // Change negative binom coeff to positive equivalent
    result += Math.pow(-1, n) * binom(a + n - 1, n) * binom(2 * a - 1, a - n - 1) * Math.pow(x, a + n);
  }
  return result;
}

function binom(a, b) { //Binomial coefficient
  return Math.factorial(a) / (Math.factorial(a-b) *  Math.factorial(b));
}

Math.factorial = function(value) { //Factorial
  var result = 1;
  if (value > 0) {
    for (var count = 1; count <= value; count ++) {
      result *= count;
    }
  } else if (value < 0) {
    for (var count = -1; count >= value; count --) {
      result *= count;
    }
  } else {
    result = 1;
  }
  return result;
}

function smoothStep(x) { //Normal smoothstep
  return -2 * Math.pow(x, 3) + 3 * Math.pow(x, 2);
}

console.log("smoothStep(0.3) = " + smoothStep(0.3));
console.log("generalSmoothStep(2, 0.3) = " + generalSmoothStep(2, 0.3));

ただし、このバージョンは階乗を計算するため、この関数は、 aの値が大きい場合の Tushar Ghosh の回答のコードよりもはるかに早く精度が低下し始めます。

于 2016-12-19T09:08:07.637 に答える