编程语言
首页 > 编程语言> > javascript-用浏览器内置JS数值求解三角函数方程

javascript-用浏览器内置JS数值求解三角函数方程

作者:互联网

给定变量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,它也应不比原始公式差.您可以使用线性形式来计算牛顿方法的起始位置,但是我不会打扰:只要您从一个相当大的值开始,牛顿方法的第一步就可以做到这一点.

标签:numerical,numeric,javascript,math,numerical-methods
来源: https://codeday.me/bug/20191029/1957917.html