jjzjj

javascript - 如何克服 NaN 并在 Javascript 中继续计算 - sqrt radicand 的负值

coder 2024-07-19 原文

我已经为 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 个仍然是使用复数计算的!

处理复杂的数字是

  1. JavaScript 本身不处理,并且
  2. 非常重要,您不想自己实现它。就是那个地方。 ma​​th.js 进来了。

阅读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使用参数 AV面积和体积。

现在我们可以使用它来定义将生成 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 的值你提供了半径r2 , 和高度 h1.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/

有关javascript - 如何克服 NaN 并在 Javascript 中继续计算 - sqrt radicand 的负值的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐