给定变量s,v和h的值,并给定诸如numeric.js的库,如何在给定的精度范围内以数字方式求解the following equation的a?
我想在浏览器中使用JS算法.
解决方法:
分离变量和参数
您可以先替换b = a / h.那会让你的方程变成
2b*sinh(1/(2b)) = sqrt(s²-v²)/h
这样,您的所有输入都在右侧,而变量在左侧,但不幸的是,它仍然以先验的形式出现在多个地方.好处是我们现在可以将右侧视为一个数字,以便对该功能有所了解.
首先看一个情节
该函数似乎表现良好:
所以你可以做standard numerical root-finding methods Newton’s method,以找到此函数采用给定值的位置(即您从右侧计算的位置).如果将根查找解释为查找某个函数为零的位置,则您要为其查找零的函数就是差值,即
2a*sinh(h/(2a)) – sqrt(s²-v²)
使用numeric.js中的优化
如果要使用numeric.js,numerical.uncmin可能是最好的选择.至少这是迄今为止我在文档中可以找到的最好的. (也许那里有一些简单的寻根实现,但是如果是这样,我还找不到它.)您将尝试查找该函数的最小值.
(2a*sinh(h/(2a)) – sqrt(s²-v²))²
解释为a的函数,并希望该最小值实际为(接近)零.通过同时提供该函数的梯度(导数)作为单独的参数,可能会得到更好的结果(即更快的收敛性和/或更低的误差).您可以use Wolfram Alpha找到该导数.
进一步重写功能
让我们将f定义为f(b)= 2b * sinh(1 /(2b)).您试图找出f处于给定值的位置.为了使收敛更快,您可以尝试将此f转换为接近线性的其他函数.玩弄地块,我想出了这个:
g(b) = (f(b) – 1)^(-1/2)
您可以将相同的转换应用于右侧,以查看此功能的所需值.对于b> 0.06这看起来是线性的,因此它应该收敛得很快.只要您的参数预期在几乎是线性的范围内,但即使对于较小的b,它也应不比原始公式差.您可以使用线性形式来计算牛顿方法的起始位置,但是我不会打扰:只要您从一个相当大的值开始,牛顿方法的第一步就可以做到这一点.