- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我已经为 calculating cylinders 设置了一个 js/three.js 程序仅由两个给定值。
唯一比较困难的计算发生在给定体积 和表面 时。从这两个值我需要计算半径或高度。
记忆公式:
体积 V = π·r²·h
表面 A = 2·π·r·(r+h)
如果您进行数学运算,您将得到三次公式:0 = r^3 + A/(-2*pi)*r + V/pi
老实说我无法解决,所以我使用了wolframalpha给出半径 r 的结果:
注意:r有3个公式,这是第一个。参见 wolframalpha .
通过尝试在 Javascript 中实现这个等式,我意识到 √(54πV^2 - A^3)
的基数是负数,Javascript 返回 NaN
。
这引出了我的问题:如何克服 NaN
并继续计算 - 我应该使用复数吗?您使用了哪些解决方法?我可以只将被除数乘以 *(-1)
,记住这个值并在以后考虑吗?
我在这里有点迷路,这是我第一次必须打败 NaN :-)
提前感谢您提供的所有提示、建议、解决方案和代码。
编辑(达到目标):生活在这个地球上的人是否可以解决three equations在 Javascript 中并可以发布他的代码?我通常用谷歌搜索 "calculate cylinder by surface and volume"似乎以前没有人做过...
最佳答案
因此,丢弃负基数并不是最佳解决方案,因为您仍然可能会排除有效的实数解,因为第二项中的基数可能会抵消第一项的虚部。此外,第二根和第三根有 i
在他们的公式中,所以你有点被迫在那里处理复数。这些根也不应该被丢弃,因为即使对于具有 3 个实根的三次方,3 个根中的 2 个仍然是使用复数计算的!
处理复杂的数字是
阅读here了解 math.js。但是对于这个问题,你只需要知道一种方法。 math.js 通过其 math
完成工作对象,我们关心的方法是math.eval(expr,scope)
这将计算一个字符串表达式 expr
并使用 scope
中指定的变量赋值.
因此,首先查看 wolfram 提供的 3 个根:
它们有点笨重。仔细观察后,它们都有一个共同的术语:
该术语是 A
的表达式和 V
, 所以让我们把它移到 A
的函数中和 V
, 称为 f
因此用该术语代替我们的新函数 f
,现在根更易于管理:
那么,让我们开始吧。您只需要包括 math.js
在你的项目的顶部:
<script type="text/javascript" language="JavaScript"
src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/0.26.0/math.min.js"></script>
进入脚本。首先,定义 f
上述功能:
var f = function(A, V) {
var scope = {A: A, V: V};
var expr = math.eval(
'(sqrt(6) pi^(3/2) sqrt(54 pi V^2-A^3)-18 pi^2 V)^(1/3)'
,scope);
return expr;
};
请注意:空格隐式表示乘以项,即 a b=a*b
, 以及一个数的立方根 n
相当于n^(1/3)
所以 f
将评估我们的expr
使用参数 A
和 V
面积和体积。
现在我们可以使用它来定义将生成 3 个根的函数,r1
, r2
, 和 r3
,给定任意面积 A
和卷V
var r1 = function(A, V) {
var scope = {A: A, V: V, f: f(A, V)};
var expr = math.eval(
'A/(6^(1/3) f)+f/(6^(2/3) pi)'
, scope);
return expr;
};
var r2 = function(A, V) {
var scope = {A: A, V: V, f: f(A, V)};
var expr = math.eval(
'-((1+i sqrt(3)) A)/(2*6^(1/3) f) - ((1-i sqrt(3)) f)/(2*6^(2/3) pi)'
, scope);
return expr;
};
var r3 = function(A, V) {
var scope = {A: A, V: V, f: f(A, V)};
var expr = math.eval(
'-((1-i sqrt(3)) A)/(2*6^(1/3) f) - ((1+i sqrt(3)) f)/(2*6^(2/3) pi)'
, scope);
return expr;
};
那么现在,让我们测试一下。使用来自 link 的值你提供了半径r
是2
, 和高度 h
是1.5
然后,卷V=pi*r^2
大约是 18.85
, 和表面积 A=2pi*r(r+h)
大约是 43.982
.使用上面定义的方法,我们可以获得根。
请注意 result
是评估 r^3 + A/(-2*pi)*r + V/pi
的结果使用给定的根,所以如果结果是 0
, 根计算正确。由于舍入误差,实际值将精确到大约 15 位数字。
var A, V, r, scope;
A = 43.982, V = 18.85;
//test r1
r = r1(A, V);
scope = {A: A, V: V, r: r};
console.log('r1', r, 'result: ',math.eval('r^3+A/(-2pi) r+V/pi', scope));
//r1 1.9999528096882697 - 2.220446049250313e-16i result: 4.440892098500626e-15 - 1.1101077869995534e-15i
//round to 5 decimals:
console.log('rounded r1:', math.round(r,5), 'rounded result: ',math.round(math.eval('r^3+A/(-2pi) r+V/pi', scope),5));
//rounded r1:1.99995 rounded result: 0
//test r2
r = r2(A, V);
scope = {A: A, V: V, r: r};
console.log('r2', r,'result: ', math.eval('r^3+A/(-2pi) r+V/pi', scope));
//r2 -2.9999999737884457 - 1.6653345369377348e-16i result: 2.6645352591003757e-15 - 8.753912513083332e-15i
//round to 5 decimals:
console.log('rounded r2:', math.round(r,5),'rounded result: ', math.round(math.eval('r^3+A/(-2pi) r+V/pi', scope),5));
//rounded r2: -3 rounded result: 0
//test r3
r = r3(A, V);
scope = {A: A, V: V, r: r};
console.log('r3', r, 'result: ',math.eval('r^3+A/(-2pi) r+V/pi', scope));
//r3 1.000047164100176 + 4.440892098500626e-16i result: -1.7762101637478832e-15i
//round to 5 decimals
console.log('rounded r3:', math.round(r,5), 'rounded result: ',math.round(math.eval('r^3+A/(-2pi) r+V/pi', scope),5));
//rounded r3: 1.00005 rounded result: 0
这与 wolfram alpha 提供的根一致. {-3,1.00005,1.99995}
另请注意 console.log()
的大部分结果的 math.js
对象将记录整个对象,如下所示:
r1 Complex { re=1.9999528096882697, im=-2.220446049250313e-16, toPolar=function(), more...}
所以我申请了一个toString()
为了可读性,我包含的结果。
关于javascript - 如何克服 NaN 并在 Javascript 中继续计算 - sqrt radicand 的负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329786/
我正在我的应用程序后台下载视频。如果用户在下载过程中重启了应用/设备,有什么方法可以在他们下次启动应用时从他们中断的地方继续下载? 最佳答案 这主要取决于文件服务器的配置(HTTP、FTP 等)。 现
我正在试验 WPF 动画,但有点卡住了。这是我需要做的: 鼠标悬停: 淡入(2 秒内从 0% 到 100% 不透明度) MouseOut: 暂停 2 秒 淡出(2 秒内从 100% 到 0% 不透明度
我的问题是这个线程的延续: Ant: copy the same fileset to multiple places 我是映射器的新手。有人(carej?)可以分享一个使用映射器来做到这一点的例子吗
继续previous question我希望能够显示一些事件指示器即使主线程被阻塞。(基于this article)。 基于所附代码的问题: 使用 Synchronize(PaintTargetWin
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我有一个场景,其中有一个线程在等待和执行任务之间循环。但是,我想中断线程的等待(如果愿意,可以跳过其余的等待)并继续执行任务。 有人知道如何做到这一点吗? 最佳答案 我认为你需要的是实现 wait()
这是我的代码架构: while (..) { for (...; ...;...) for(...;...;...) if ( )
import java.util.Scanner; public class InteractiveRectangle { public static void main(String[] args)
如何将 continue 放入具有函数的列表理解中? 下面的示例代码... import pandas as pd l = list(pd.Series([1,3,5,0,6,8])) def inv
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在用 python 开发一个程序,遇到了一个我不知道如何解决的问题。我的意图是使用 with 语句,避免使用 try/except。 到目前为止,我的想法是能够使用 continue 语句,就像在
我对下一段代码的执行感到困惑: label: for (int i = 0; i < 100; i++) { if (i % 2 == 0) c
这很好用: #include int main(){ volatile int abort_counter = 0; volatile int i = 0; while (i
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。 直接在主线程中,通过wait、notify、notifyAll去控制读文件的线
link text 我得到了引用计数的概念 所以当我执行“del astrd”时,引用计数降为零并且 astrd 被 gc 收集? 这是示例代码。这些代码是我在昨天的问题之后开发的:link text
我想首先检查我的 Range 是否有 #NA 错误,然后在退出宏之前显示包含错误的单元格地址。这是我到目前为止所做的。 现在,如果出现错误,我想显示 MsgBox警告用户错误并停止程序的其余部分执行,
while( (c = fgetc(stdin)) != EOF ){ count++; if (count == lineLen - 1){ moreChars =
我是一名优秀的程序员,十分优秀!