共轭梯度法:

function [ x, r, k ] = CorGrant( x0, A, b )
x = x0;
r = b - A * x0;
d = r;
X = ones(length(x), 1);
k = 0;
while 1
if norm(r, Inf)<1e-6
break
end
k = k + 1; arf = (r' * r) / (d' * A * d);
x = x + arf * d;
r2 = r - arf * A * d;
brt = (r2' * r2) / (r' * r);
d = r2 + brt * d; r = r2;
end end

About the code:

  • A : the input A of Ax = b
  • b : the input b of Ax = b
  • x0 : the input guess of x
  • x : the output x of Ax = b
  • r : the remainder between calculation x and exact x
  • k : calculation times

多元牛顿方法:

使用了共轭梯度法来辅助,其中需要用到雅可比矩阵

function [x] = Multi_Newdd(x0, df1_1, df1_2, df2_1, df2_2, f1, f2, k)
x = x0;
n = length(x0);
for i = 1 : k
A = DF(df1_1, df1_2, df2_1, df2_2, x);
b = -1 * F(f1, f2, x);
s = CorGrant_ForNewdd(zeros(n, 1), A, b, 7);
x = x + s;
end
end function [ x ] = CorGrant_ForNewdd( x0, A, b, k )
x = x0;
r = b - A * x0;
d = r;
X = ones(length(x), 1);
for i = 1 : k arf = (r' * r) / (d' * A * d);
x = x + arf * d;
r2 = r - arf * A * d;
brt = (r2' * r2) / (r' * r);
d = r2 + brt * d; r = r2;
end end function [x] = DF(df1_1, df1_2, df2_1, df2_2, x0)
x = zeros(length(x0), length(x0));
x(1, 1) = df1_1(x0(1, 1), x0(2, 1));
x(1, 2) = df1_2(x0(1, 1), x0(2, 1));
x(2, 1) = df2_1(x0(1, 1), x0(2, 1));
x(2, 2) = df2_2(x0(1, 1), x0(2, 1));
end function [x] = F(f1, f2, x0)
x = zeros(length(x0), 1);
x(1, 1) = f1(x0(1, 1), x0(2, 1));
x(2, 1) = f2(x0(1, 1), x0(2, 1));
end

About the code:

  • f1 : the input handle of Function F
  • f2 : the input handle of Function F
  • df1_1 : the input handle of Function DF
  • df1_2 : the input handle of Function DF
  • df2_1 : the input handle of Function DF
  • df2_2 : the input handle of Function DF
  • x0 : the input guess of x
  • x : the output x of Ax = b
  • k : calculation times

例子:

clear all
clc f1 = @(u, v) 6*u^3+u*v-3*v^3-4;
f2 = @(u, v) u^2-18*u*v^2+16*v^3+1; df1_1 = @(u, v) 18*u^2+v;
df1_2 = @(u, v) u-9*v^2;
df2_1 = @(u, v) 2*u-18*v^2;
df2_2 = @(u, v) -36*u*v+48*v^2; n = 2;
k = 7;
x0_1 = [1.15; 1.15];
x0_2 = [2; 2];
x0_3 = [3; 3]; x1 = Multi_Newdd(x0_1, df1_1, df1_2, df2_1, df2_2, f1, f2, k)
x2 = Multi_Newdd(x0_2, df1_1, df1_2, df2_1, df2_2, f1, f2, k)
x3 = Multi_Newdd(x0_3, df1_1, df1_2, df2_1, df2_2, f1, f2, k)

Broyden方法:

function [x, k] = Broyden_I(x0, A, f1, f2, k)
for i = 1 : k
x1 = x0 - inv(A) * F(f1, f2, x0);
r = x1 - x0;
tri = F(f1, f2,x1) - F(f1, f2, x0);
A = A + ((tri - A * r) * r') / (r' * r);
x0 = x1;
end
x = x1;
end

About the code:

  • f1 : the input handle of Function F
  • f2 : the input handle of Function F
  • x0 : the input guess of x
  • x : the output x of Ax = b
  • k : calculation times

例子:

clear all
clc x0 = [1; 1];
A = eye(2); % (a)
f1 = @(u, v) u^2+v^2-1;
f2 = @(u, v) (u-1)^2+v^2-1;
x_ans = [0.5; (3^0.5)/2];
[xa, ka] = Broyden_I(x0, A, f1, f2, 9);xa
norm(xa - x_ans, Inf) % (b)
f1 = @(u, v) u^2+4*v^4-4;
f2 = @(u, v) 4*u^2+v^2-4;
x_ans = [2/(5^0.5); 2/(5^0.5)];
[xb, kb] = Broyden_I(x0, A, f1, f2, 9);xb
norm(xb - x_ans, Inf) % (c)
f1 = @(u, v) u^2-4*v^2-4;
f2 = @(u, v) (u-1)^2+v^2-4;
x_ans = [4*(1+6^0.5)/5; ((3+8*6^0.5)^0.5)/5];
[xc, kc] = Broyden_I(x0, A, f1, f2, 10);xc
norm(xc - x_ans, Inf)

matlab实现共轭梯度法、多元牛顿法、broyden方法的更多相关文章

  1. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  2. MATLAB(1)——基本调试方法(Debug)

    作者:桂. 时间:2017-02-28  07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处, ...

  3. MATLAB读取写入文本数据最佳方法 | Best Method for Loading & Saving Text Data Using MATLAB

    MATLAB读取文件有很多方法.然而笔者在过去进行数据处理中,由于函数太多,相互混杂,与C#,Python等语言相比,反而认为读取文本数据比较麻烦.C#和Python等高级语言中,对于大部分的文本数据 ...

  4. 常见优化算法统一框架下的实现:最速下降法,partan加速的最速下降法,共轭梯度法,牛顿法,拟牛顿法,黄金分割法,二次插值法

    常见优化算法实现 这里实现的主要算法有: 一维搜索方法: 黄金分割法 二次差值法 多维搜索算法 最速下降法 partan加速的最速下降法 共轭梯度法 牛顿法 拟牛顿法 使用函数表示一个用于优化的目标, ...

  5. 使用MATLAB对图像处理的几种方法(上)

    实验一图像的滤波处理 一.实验目的 使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...

  6. matlab eps中文乱码的解决方法

    直接存成eps总是乱码 最优解决方法是matlab print 保存成jpg,之后用adobe  acrobat pro 打开jpg文件另存为eps

  7. 【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

    1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 ...

  8. MATLAB(4)——图片保存方法汇总及常用指令

    作者:桂. 时间:2017-03-03  19:30:03 链接:http://www.cnblogs.com/xingshansi/p/6498318.html 前言 本文为MATLAB系列第四篇. ...

  9. matlab中tic和toc使用方法

    tic和toc用来记录matlab命令运行的时间.  tic用来保存当前时间,而后使用toc来记录程序完毕时间. 两者往往结合使用,使用方法例如以下: 程序代码: tic  operations  t ...

随机推荐

  1. 磁珠 磁环 双向二极管 TVS二极管

    磁珠专用于抑制信号线.电源线上的高频噪声和尖峰干扰,还具有吸收静电脉冲的能力.磁珠是用来吸收超高频信号,像一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR SDRAM,RAMBUS等)都需要 ...

  2. Atom 下载、安装

    Atom工具的使用 由github发布的前端开发工具 非常强大的开发工具 官网下载地址:https://atom.io Atom的插件和主题安装和配置

  3. SimpleDateFormat 相关用法

    parse(String s)返回的是一个Date类型数据,format(Date d)返回的是一个String类型的数据 SimpleDateFormat sd = new SimpleDateFo ...

  4. ASP.Net 类(CS)文件怎样获取Web应用程序的路径

    Web应用程序,写了一个线程CS类别,这个类别将会放于Global.asax文件中执行,主要是监控程序下某一个文件是否有异动,而作出相应警示动作,如发送邮件等. 实现运行过程中,也许会有一个情况出现, ...

  5. iOS-KVC和KVO精炼讲解(干货)

    一.KVO介绍 KVO就是观察者模式,说白了就是你关心的一个值改变了,你就会得到通知.你就可以在你想处理的地方处理这个值. 二.KVO的使用 一般分为三步: 注册监听 使用方法: /** * 添加KV ...

  6. js动态添加事件

    转载的,但不明确出处 往往我们需要在 JS 中动态添加事件,这就涉及到浏览器兼容性问题了,以下谈及的几种方法,我们也常常混合使用.方法一.setAttributevar obj = document. ...

  7. 8款强大的CSS3/HTML5动画及应用源码

    1.CSS3 jQuery UI控制滑杆插件 今天我们要来分享一款基于CSS3和jQuery UI的控制滑杆插件,这款控制滑杆是在HTML5滑杆元素的基础上进行自定义CSS3渲染,所以外观更加漂亮.另 ...

  8. 杭电ACM2098--分拆素数和

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2098 这是源码.其实我本不想拿出源码,毕竟源码很容易被复制. 我这里刚开始出错的地方有 0_0_12811 ...

  9. THREE.js代码备份——canvas_lines(随机点、画线)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - l ...

  10. C++ 11 之推导关键词

    C++ 11新增了两个推导关键词,auto & decltype 1.区别 auto:用于推导变量类型: decltype: 用于推导表达式或者函数返回值 2.直接上代码 intmain() ...