标签:numerical numeric javascript math numerical-methods
给定变量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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。