【问题标题】:Use Matlab/Maple to find roots of a nonlinear equation使用 Matlab/Maple 求非线性方程的根
【发布时间】:2014-11-28 01:40:42
【问题描述】:

我很难找到非线性方程的根。我已经尝试过 Matlab 和 Maple,两者都给了我同样的错误

Error, (in RootFinding:-NextZero) can only handle isolated zeros

等式是这样的

-100 + 0.1335600000e-5*H + (1/20)*H*arcsinh(2003.40/H)

等式中的变量是H

如何找到这个方程的根(或近似根)?

Matlab 代码: 函数文件:

function hor_force = horizontal(XY, XZ, Lo, EAo, qc, VA)
syms H
equation = (-1*ZZ) + (H/qc)*(cosh((qc/H)*(XZ- XB))) - H/qc + ZB;
hor_force = `solve(equation);`

主文件:

EAo = 7.5*10^7;
Lo = 100.17;
VA = 2002;

XY = 0;
ZY = 0;

XB = 50;
ZB = -2;

XZ = 100;
ZZ = 0;

ql = 40;

Matlab 显示的错误:

Error using sym/solve (line 22)
Error using maplemex
Error, (in RootFinding:-NextZero) can only handle isolated zeros

Error in horizontal (line 8)
hor_force = solve(equation);
Error in main (line 34)
h = horizontal(XY, XZ, Lo, EAo, ql, VA)

http://postimg.org/image/gm93z3b7z/

【问题讨论】:

  • 在 Matlab R2014b 中对我来说很好。你在用什么version?那是产生错误的实际代码吗?请编辑以在 Matlab 中显示完整的错误消息。
  • 所提供的参数肯定与等式中的参数不对应。
  • @horchler 是的,这与我使用的代码相同。我正在使用 Matlab 2013b。我已经发布了 Matlab 显示的错误消息。请帮忙。
  • @horchler 不好意思,我贴了一些其他同类型问题的参数。我已经编辑了它。你能重新检查一下吗?
  • 错误中的maplemex 很有趣。我很惊讶在 Matlab 的符号数学工具箱中还剩下 Maple 的任何东西。在命令窗口中输入symengine 会得到什么?您是否可能在 R2013b 中使用旧版本的工具箱?

标签: matlab symbolic-math maple equation-solving nonlinear-functions


【解决方案1】:

您不需要符号工具箱:

首先,创建一个可以在输入中获取向量的匿名函数(使用.*./

equation = @(H) ((-1*ZZ) + (H./qc).*(cosh((qc./H).*(XZ- XB))) - H./qc + ZB);

其次,创建一个向量,然后将其插入方程中,以找出函数符号何时发生变化的近似值。最后,使用fzerox0 作为第二个输入参数。

H = linspace(1,1e6,1e4);  
x0 = H(find(diff(sign(equation(H)))));  %// Approximation of when the line crosses zero
x = fzero(equation, x0)  %// Use fzero to find the crossing point, using the initial guess x0
x =    
   2.5013e+04
equation(x)
ans =
     0

验证:

您可能想查看this question,了解有关如何查找非多项式根的更多信息。

【讨论】:

  • 仅供参考,因为这个函数是单调递减的,并且在正轴上只有一个实根,所以寻找初始猜测的 x0 = H(find(diff(sign(equation(H))))); 代码是不必要的,而且效率很低。 fzero 在这种情况下有非常有效的代码来包围根。或者您可以设置x0 = [1 1e6];,即您的linspace 调用上的界限,然后通过连续将域分成两部分,它会紧紧地包围根,迭代次数比1e4 少得多。
【解决方案2】:

在 Maple 中,使用您问题中的表达式,

restart:

ee := -100 + 0.1335600000e-5*H + (1/20)*H*arcsinh(2003.40/H):

Student:-Calculus1:-Roots(ee, -1e6..1e6);

            [               5                           ]
            [-1.240222868 10 , -21763.54830, 18502.23816]

#plot(ee, H=-1e6..1e6, view=-1..1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多