考虑以下问题:给定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
老实说没有任何线索,我知道我的代码毫无意义,但我甚至不知道从哪里开始。如果我能得到一些很好的帮助。
答案 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