牛顿法程序及算例,使用Matlab
时间: 2023-06-21 07:14:55 浏览: 128
牛顿法是一种迭代算法,可以用来求解非线性方程或最优化问题。下面是一个使用Matlab实现牛顿法求解非线性方程的示例程序:
```matlab
function [x, fx, k] = newton(f, df, x0, tol, max_iter)
% f: 非线性方程
% df: f的导数
% x0: 初始点
% tol: 精度
% max_iter: 最大迭代次数
k = 0;
fx = f(x0);
while abs(fx) > tol && k < max_iter
x = x0 - fx/df(x0);
fx = f(x);
x0 = x;
k = k + 1;
end
if k == max_iter
warning('达到最大迭代次数');
end
```
接下来,我们使用这个程序来求解非线性方程 $f(x) = x^3 - 2x - 5 = 0$。
首先,我们需要定义 $f(x)$ 和它的导数 $f'(x)$:
```matlab
f = @(x) x^3 - 2*x - 5;
df = @(x) 3*x^2 - 2;
```
接着,我们可以使用初始点 $x_0 = 2$ 来调用牛顿法程序:
```matlab
[x, fx, k] = newton(f, df, 2, 1e-6, 100);
```
这会返回 $x$ 的近似解、 $f(x)$ 在 $x$ 处的值以及迭代次数。在这个例子中,程序返回的结果是:
```
x = 2.094551481542327
fx = -6.661338147750939e-16
k = 5
```
我们可以看到,牛顿法迭代了5次,得到了非常接近精确解 $x \approx 2.09455148154233$ 的结果。
至于最优化问题的算例,可以参考以下代码:
```matlab
%% 例1:求解 Rosenbrock 函数的最小值
% Rosenbrock 函数:f(x,y) = (1-x)^2 + 100(y-x^2)^2
% 定义 Rosenbrock 函数和它的梯度
f = @(x) (1 - x(1))^2 + 100*(x(2) - x(1)^2)^2;
df = @(x) [-2*(1-x(1)) - 400*x(1)*(x(2)-x(1)^2); 200*(x(2)-x(1)^2)];
% 初始点
x0 = [-1.2; 1];
% 调用牛顿法程序
[x, fx, k] = newton(@(x)f(x'), @(x)df(x'), x0, 1e-6, 1000);
% 结果
disp(['迭代次数:' num2str(k)]);
disp(['最小值:' num2str(fx)]);
disp(['最优解:' num2str(x')]);
%% 例2:求解 Rastrigin 函数的最小值
% Rastrigin 函数:f(x,y) = 20 + x^2 - 10*cos(2*pi*x) + y^2 - 10*cos(2*pi*y)
% 定义 Rastrigin 函数和它的梯度
f = @(x) 20 + x(1)^2 - 10*cos(2*pi*x(1)) + x(2)^2 - 10*cos(2*pi*x(2)));
df = @(x) [2*x(1) + 20*pi*sin(2*pi*x(1)); 2*x(2) + 20*pi*sin(2*pi*x(2))];
% 初始点
x0 = [-2; 3];
% 调用牛顿法程序
[x, fx, k] = newton(@(x)f(x'), @(x)df(x'), x0, 1e-6, 1000);
% 结果
disp(['迭代次数:' num2str(k)]);
disp(['最小值:' num2str(fx)]);
disp(['最优解:' num2str(x')]);
```
这个示例程序分别求解了 Rosenbrock 函数和 Rastrigin 函数的最小值。使用牛顿法可以得到较快的收敛速度,但需要注意选择合适的初始点,否则可能会陷入局部最小值。
阅读全文