【MATLAB】二维搜索之阻尼牛顿法

clc;clear;

syms x1x2 v

f =x1^2+x2^2+x1*x2-3*x1;

% f =x1^2+2*x2^2-4*x1-2*x1*x2; %测试函数1

% f =x1^3+x2^3-3*x1*x2; %测试函数2

x =[2,2]; %设置初始点

afx =[diff(f,x1),diff(f,x2)];  %求出一阶偏导

a2fx=[diff(afx(1),x1),diff(afx(1),x2);diff(afx(2),x1),diff(afx(2),x2)];  %求出二阶偏导

while(1)

    afxx = subs(afx,[x1,x2],x);  %计算一阶偏导在x处的值

    if sum(afxx.^2)<1e-3  %迭代终止条件

        disp('阻尼牛顿法求函数极小点为:')

        x = double(x); %将sym型转化为double型

        fprintf('(%f,%f)\n',x(1),x(2)) %打印计算结果

        break;

    end

    a2fxx = subs(a2fx,[x1,x2],x); %计算具体数值

    if det(a2fxx)==0  %无最优解的判别条件

        disp('无最优解');break;

    end

    s = -inv(a2fxx)*afxx'; 

    y = subs(f,[x1,x2],x+v*s');

    dyv = diff(y,v);

    vv = solve(dyv==0);

    fff = subs(y,v,vv);

    vv0 = find(vv>0);

    vv = vv(find(fff == min(fff(vv0)))); %求出使得fff最小的非负vv值

    x = x+vv*s'; %求出新的x的值

end

程序输出结果:

阻尼牛顿法求函数极小点为:

(2.000000,-1.000000)

阻尼牛顿法是一种用于解决非线性方程组的数值求解方法。在Matlab中,我们可以利用这种方法来求解方程组。 阻尼牛顿法的主要思想是将非线性方程组转化为一个等价的线性系统,然后通过迭代求解线性系统来逼近非线性方程的根。该方法结合了牛顿法阻尼因子的概念。 在Matlab中,我们可以使用内置的函数`fsolve`来实现阻尼牛顿法。这个函数可以在给定初始点的情况下,自动求解非线性方程组,并返回方程的根。 使用`fsolve`函数时,首先要定义一个函数来表示非线性方程组。这个函数需要接受一个向量作为输入,并返回一个向量作为输出。然后,我们可以通过调用`fsolve`函数来求解方程组。 例如,假设我们要求解方程组f(x) = [x^2 - 2x + 1; x^2 - 4] = 0,我们可以先定义函数f如下: ```Matlab function y = f(x) y = [x(1)^2 - 2*x(1) + 1; x(2)^2 - 4]; end ``` 然后,我们可以使用`fsolve`函数来求解方程组: ```Matlab x0 = [0; 0]; % 初始点 x = fsolve(@f, x0); % 求解方程组 ``` 在上面的例子中,我们将初始点设为[0; 0],然后调用`fsolve`函数来求解方程组f(x) = 0。函数的返回值x就是方程组的根。 需要注意的是,阻尼牛顿法并不是一种保证收敛的方法,因此,对于复杂的非线性方程组,可能需要多次迭代才能达到较高的精度。此外,初始点的选择对求解的效果也有很大影响。因此,在使用阻尼牛顿法时,需要根据实际情况选择适当的初始点和迭代次数。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值