修改后的割线法Javascript算法?

时间:2018-11-17 16:39:19

标签: numerical-methods numerical-analysis numerical-computing

我需要您的帮助才能将此New Secant Method编码为Javascript。

割线方法使用两个起始参数,而这种新方法仅需要一个起始参数。

谢谢。


谢谢您的回答[ed:comment],这是我尝试过的方法,但是没有用:

<script>
    var x
    var pi = 3.141592653589793, e = 2.7182818284590452;

    function meth_sec() {
        with (Math) {
            f = "sin(x)-x/2"; a = 1; s = 1;
            f = prompt("your function f(x) = ", f)
            while (s >= 0) {
                a = eval(prompt("type the approximation. = ", a))                   
                x = a;                     
            }
        }
    } function iter() {
        with (Math) {
            y = eval(f)
            x = a + (abs(y)/2) - abs(y)*((y(a+abs(y/2)))/((y(a+abs(y/2)))-y)
            return x
        }
    }
    function sgn(y) { return (y > 0) - (y < 0) }

</script>

1 个答案:

答案 0 :(得分:0)

这看起来像是Steffensen方法的一种变体,以与Aitken的平方平方过程密切相关而著称。它不是割线方法,而更像是牛顿式方法,用除数近似值f'(x)代替了x_new = x-f(x)/f'(x)中的导数(f(x+h(x))-f(x))/h(x),从而得出了公式

x_new = x - (f(x)*h(x))/(f(x+h(x))-f(x))
      = x + h(x) + (f(x+h(x))*h(x))/(f(x+h(x))-f(x))

其中h(x)=O(f(x))会在x逼近根时强制向导数收敛。 Steffensen的方法使用h(x)=f(x),而由于某种原因,引用的方法更喜欢h(x)=abs(f(x))/2。在f的重新缩放下,它们都不是不变的,因此没有明确的优先选择,在某些情况下,这两种方法都具有轻微的优势。

根据与牛顿法的关系,如果根本没有收敛,人们将期望二次收敛到简单根。


您的问题是您同时使用y作为值和函数。除了用户提供的代码段上的the security problem of using eval以外,您还需要提供x参数来补充函数字符串,然后调用函数字符串的求值,以及针对所有所需要点的求值功能值。

关于如何安全地分析和评估表达式字符串的讨论是Evaluating a string as a mathematical expression in JavaScript