【问题标题】:How to solve this nonlinear equation in Python, Octave, or Matlab? [closed]如何在 Python、Octave 或 Matlab 中求解这个非线性方程? [关闭]
【发布时间】:2020-03-10 17:42:58
【问题描述】:

如何使用 Python、Octave 或 Matlab 求解这个方程?

对于c的不同值,需要能够找到x的解。

【问题讨论】:

  • 欢迎来到stackoverflow!请务必查看how to ask good questions,了解如何使其更完整和更好地格式化。照原样,我不确定您在问什么,而且图片背后的内容很难搜索。
  • c 是否仅限于条件c ≥ 0?似乎如果存在c > 0 解决方案,并且对于c = 0,则通过检查x = 0。但是,c 的负值似乎有问题。

标签: python matlab math octave equation-solving


【解决方案1】:

使用Solvers

# this is an example
>>> from sympy.solvers import solve
>>> from sympy import Symbol
>>> x = Symbol('x')
>>> solve(x ** 2 - 1, x)
[-1, 1]

【讨论】:

  • 我尝试求解 c=1 但编辑器抛出了这个错误。 “没有实现任何算法来求解方程 x + log(1 - 267/(1000*x))”
  • 试试这个: from sympy.solvers import nsolve /// from sympy import Symbol, log /// x = Symbol('x') /// nsolve(x + log(1 - 267/ (1000*x)), x,1)
【解决方案2】:

由于方程有一些浮点常数,最好使用nsolve 进行数值求解:

from sympy import Eq, log, exp, nsolve
from sympy.abc import x

c = 267
sol = nsolve(Eq(x ** 0.22 * (c * exp(-c * x ** 0.22) - 1), c * log(0.7657)), x, 1)
print(sol)  # 264587674.024352

【讨论】:

    【解决方案3】:

    无需工具箱:

    在 MATLAB 中,您可以使用 fminsearch() 以数字方式执行此操作。

    关键思想是将方程y = w重写为y - w = 0。然后,构造一个convex function 以保证返回的局部最小值确实是全局最优的,例如abs(y-w)

    % Rewrite equation y = w as y - w = 0.
    % Then minimize abs(y-w).
    fh =@(x,c) abs((x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657));
    
    c = 267;
    x0 = 5;                                      % initial guess
    [x, abserr] = fminsearch(@(x) fh(x,c),x0)    % x = 264587674.0243530
    

    请注意,abserr = 4.2633e-14 非常接近于零(平等)。

    同样,您可以最小化误差平方和以获得相同的答案。

    % minimize sum((y-w).^2)
    gh =@(x,c) sum(((x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657)).^2);
    [x, sse] = fminsearch(@(x) fh(x,c),x0) 
    

    而不是使用arrayfun(),为每个c 值获取不同的x 值,它可能更容易循环。

    C = [100 267 300].';
    Xval = zeros(size(C));
    for ii = 1:length(C)
        Xval(ii) = fminsearch(@(x) fh(x,C(ii)),x0);
    end
    

    不推荐:
    虽然fzero() 也可以解决y - w = 0,但请注意它会中止搜索包含符号变化的区间(如果x 为负数)。因此,您要么必须以某种方式对该方向添加惩罚,要么尝试从不同的起始值。

    % solve y-w==0
    zh =@(x,c) (x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657)
    

    使用相同的起点,

    x = fzero(@(x) zh(x,c),x0)
    

    返回错误

    退出 fzero:中止搜索包含符号的区间 改变 因为在搜索过程中遇到了复杂的函数值。 (-1.4 处的函数值为 70.4499-0.686399i。)检查函数或尝试 再次使用不同的起始值。 x = NaN

    同时

    x = fzero(@(x) zh(x,c),2e8)       % adjusted starting guess
    

    工作得很好。

    使用 MATLAB R2019a 测试

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多