Lambert W功能

时间:2018-02-16 19:37:12

标签: matlab

考虑以下问题:给定c≥-1 / e的值,找到x的值,使得xe ^ x = c。

使用牛顿方法求解c≥-1 / e值的方程(提示:解决问题(c-xe ^ x = 0)。产生三个表,显示你的方法收敛为c = 0.5,c = 1 ,使用函数lambertw生成的值c = 10.将停止条件设置为e = 10 ^ -14。您可能需要尝试进行初始猜测。

a = 1;
f = @(x) c-x*e^x;
df = @(x) -1/x^2;
x0 = 2;
tol = 1e-15;
  for n = 1:MAX_ITER
  x(n+1) = x(n) - f(x(n))/df(x(n));
  if abs(x(n+1)-x(n)) < tol*abs(x(n+1))
    break;
  end

老实说没有任何线索,我知道我的代码毫无意义,但我甚至不知道从哪里开始。如果我能得到一些很好的帮助。

1 个答案:

答案 0 :(得分:0)

您的算法已经很好,只需要进行一些小的调整。 在第一行中,我假设a应为c。指数为exp(x),而不是e^x。您的衍生产品是错误的,MAX_ITER未定义。如果您还将x0更改为x(1),那么它可以正常工作。

我可以自由地为不同的c添加第二个循环,并将迭代保存在一个单元格中(在这种情况下,每个单元格包含一个向量的1x3单元格):

cs = [.5,1,10];                                                             % different c values
f = @(x) c-x*exp(x);                                                        % function to solve
df = @(x) -(x+1)*exp(x);                                                    % derivative of function
u = cell(1,length(cs));                                                     % cell to save the different x while iterating 
tol = 1e-15;                                                                % tolerance
MAX_ITER = 10^10;                                                           % max number of iterations
for i=1:length(cs)                                                          % loop through different c
    c = cs(i);
    u{1}(1) = 2;                                                            % initial guess
    for n = 1:MAX_ITER
        u{i}(n+1) = u{i}(n) - f(u{i}(n))/df(u{i}(n));                   
        if abs(u{i}(n+1)-u{i}(n)) < tol*abs(u{i}(n+1))                      % check if ok
            break;
        end
    end
    assert(u{i}(end)*exp(u{i}(end)) == c, 'Correct solution not found')     % message if after MAX_ITER no solution is found
end