使用MATLAB编写一个函数,在二维中实现牛顿法

2024-04-13

我正在尝试编写一个在二维中实现牛顿法的函数,虽然我已经做到了这一点,但我现在必须调整我的脚本,以便我的函数的输入参数必须是列向量(雅可比矩阵)中的 f(x)的f(x),最初的猜测x0以及函数的公差f(x)及其雅可比矩阵位于单独的 .m 文件中。

作为我编写的实现牛顿方法的脚本的示例,我有:

n=0;            %initialize iteration counter     
eps=1;          %initialize error     
x=[1;1];        %set starting value

%Computation loop     
while eps>1e-10&n<100 
    g=[x(1)^2+x(2)^3-1;x(1)^4-x(2)^4+x(1)*x(2)];         %g(x)      
    eps=abs(g(1))+abs(g(2));                             %error     
    Jg=[2*x(1),3*x(2)^2;4*x(1)^3+x(2),-4*x(2)^3+x(1)];   %Jacobian     
    y=x-Jg\g;                                            %iterate     
    x=y;                                                 %update x     
    n=n+1;                                               %counter+1     
end 

n,x,eps       %display end values

因此,通过这个脚本,我已将函数和雅可比矩阵实现到实际脚本中,并且我正在努力弄清楚如何实际创建具有所需输入参数的脚本。

Thanks!


如果您不介意,我想重组您的代码,使其更加动态且更易于阅读。

让我们从一些预备知识开始。如果您想让脚本真正动态化,那么我建议您使用符号数学工具箱。这样,您就可以使用 MATLAB 为您处理函数的导数。您首先需要使用syms命令,后跟任何您想要的变量。这告诉 MATLAB 您现在要将此变量视为“符号”(即不是常量)。让我们从一些基础知识开始:

syms x;
y = 2*x^2 + 6*x + 3;
dy = diff(y); % Derivative with respect to x.  Should give 4*x + 6;
out = subs(y, 3); % The subs command will substitute all x's in y with the value 3
                  % This should give 2*(3^2) + 6*3 + 3 = 39

因为这是 2D,我们需要 2D 函数......所以让我们定义x and y作为变量。你调用的方式subs命令会略有不同:

syms x, y; % Two variables now
z = 2*x*y^2 + 6*y + x;
dzx = diff(z, 'x'); % Differentiate with respect to x - Should give 2*y^2 + 1
dzy = diff(z, 'y'); % Differentiate with respect to y - Should give 4*x*y + 6
out = subs(z, {x, y}, [2, 3]); % For z, with variables x,y, substitute x = 2, y = 3
                               % Should give 56

另一件事......我们可以将方程放入向量或矩阵中并使用subs同时替换所有值x and y代入每个方程。

syms x, y;
z1 = 3*x + 6*y + 3;
z2 = 3*y + 4*y + 4;
f = [z1; z2];
out = subs(f, {x,y}, [2, 3]); % Produces a 2 x 1 vector with [27; 25]

我们可以对矩阵做同样的事情,但为了简洁起见,我不会向您展示如何做到这一点。我将遵循代码,然后您就可以看到它。

现在我们已经确定了这一点,让我们一次处理一段代码,以真正实现这一动态。您的函数需要初始猜测x0, 功能f(x)作为列向量,雅可比矩阵作为 2 x 2 矩阵,公差tol.

在运行脚本之前,您需要生成参数:

syms x y; % Make x,y symbolic
f1 = x^2 + y^3 - 1; % Make your two equations (from your example)
f2 = x^4 - y^4 + x*y;
f = [f1; f2]; % f(x) vector

% Jacobian matrix
J = [diff(f1, 'x') diff(f1, 'y'); diff(f2, 'x') diff(f2, 'y')];

% Initial vector
x0 = [1; 1];

% Tolerance:
tol = 1e-10;

现在,将您的脚本变成一个函数:

% To run in MATLAB, do: 
% [n, xout, tol] = Jacobian2D(f, J, x0, tol);
% disp('n = '); disp(n); disp('x = '); disp(xout); disp('tol = '); disp(tol);

function [n, xout, tol] = Jacobian2D(f, J, x0, tol)

% Just to be sure...
syms x, y;

% Initialize error
ep = 1; % Note: eps is a reserved keyword in MATLAB

% Initialize counter
n = 0;

% For the beginning of the loop
% Must transpose into a row vector as this is required by subs
xout = x0';

% Computation loop     
while ep > tol && n < 100 
   g = subs(f, {x,y}, xout);   %g(x)
   ep = abs(g(1)) + abs(g(2)); %error     
   Jg = subs(J, {x,y}, xout);  %Jacobian  
   yout = xout - Jg\g;         %iterate     
   xout = yout;                %update x     
   n = n + 1;                  %counter+1     
end

% Transpose and convert back to number representation
xout = double(xout');

我可能应该告诉您,当您使用符号数学工具箱进行计算时,计算时数字的数据类型是sym目的。您可能想将它们转换回实数,因此您可以使用double把他们赶回去。但是,如果您将它们留在sym格式,如果您正在寻找的话,它会将您的数字显示为整齐的分数。投射到double如果你想要小数点表示形式。

现在,当您运行此函数时,它应该会为您提供所需的内容。我还没有测试过这段代码,但我很确定这会起作用。

很高兴回答您可能有的更多问题。希望这可以帮助。

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用MATLAB编写一个函数,在二维中实现牛顿法 的相关文章

  • 使用 MATLAB 读取 CSV 文件?

    我正在尝试使用 MATLAB 读取 csv 文件 这是我的代码 csvread out2 csv out2 csv 如下所示 03 09 2013 23 55 12 129 32 129 33 03 09 2013 23 55 52 129
  • 有没有办法在 mex 文件中制作 try-catch 语句?

    我知道在 C 中没有内置的方法来执行 try catch 语句 但是 MATLAB 是否为 MEX 文件提供了任何类型的 try catch 功能 我尝试使用Longjmp and Setjmp以中描述的方式http www di unip
  • Matlab更新子图并坚持下去

    我在更新子图时遇到问题 我将我的问题归结为以下示例 win figure 1 win sub1 subplot 2 2 1 win sub2 subplot 2 2 2 win sub3 subplot 2 2 3 win sub4 sub
  • 如何在 MATLAB 中调整矩阵大小?

    假设我有一个1 by 12矩阵 我想将其调整为4 by 3矩阵 我怎么能这样做呢 我当前的解决方案有点丑陋 for n 1 length mat 3 out n 1 3 mat n 1 3 1 n 1 3 3 end 有一个更好的方法吗 r
  • 将 MATLAB 单元格类型转换为 C++

    我正在使用 C 转换 MATLAB 程序犰狳 http arma sourceforge net docs html syntax对于矩阵代数 我被困住了cell http blogs mathworks com loren 2006 06
  • MatLab 中的输出有小数点的上限 [重复]

    这个问题在这里已经有答案了 我修改了 MatLab 中的一些代码 以便它可以给出函数 cos x 3 x 的根 当我运行代码并要求它返回 xnew 的值 因为 xnew 应该等于函数的根 时 它仅将 xnew 返回到小数点后 4 位 我希望
  • MATLAB:让audioplayer()在函数结束后继续播放

    我正在使用使用以下子函数的代码 function playTone duration toneFreq Generate a tone samplesPerSecond 44100 the bit rate of the tone y si
  • Matlab:通过扩展向量来扩展矩阵

    我有一个dxmxn matrix A 解释 对于每个n 有m维度向量d 我想将每个 d 维向量扩展如下 考虑一个向量v维度 d 1 2 d 它是 x 1 x 2 x d 但为了简单起见 我删除了 x 目标是延长v获得一个d d向量形式 1
  • ND 输入的 im2col 算法

    我正在尝试为输入维度 gt 2D 编写自己的 im2col 算法 目前我正在研究 Matlab im2col 的实现 但是 我找不到任何有关二维以上输入的情况的文档 如果我将 3D 张量输入到函数中 我确实会得到输出 不过我不太明白你是如何
  • 使用 MAT2CELL 的 MATLAB

    我有以下矩阵 letter A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h ii jj k l m o p q r s t u v w x y z nu
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • iOS 将 URL 中的音频分成帧

    我正在 iOS 上开发一个简单的网络广播应用程序 具有非常简单的语音 音乐识别功能 主要思想是一个收音机 它播放来自 url 的信号 同时检查正在广播的信号类型 当它检测到语音时 它会改变频道等等 我使用 Storyboards 和 AVF
  • 如何从矩阵的每一行中减去一个向量? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将矩阵的每一行除以固定行 https stackoverflow com questions 4723824 how can i divide each row of a matrix by a
  • 同时使用两个数组中的元素的过滤器

    假设我们有两个大小相同的数组 A and B 现在 我们需要一个过滤器 对于给定的掩码大小 从以下位置选择元素A 但删除掩码的中心元素 并在其中插入相应的元素B 所以 3x3 伪掩码 看起来类似于 A A A A B A A A A 对平均
  • 如何在matlab中显示图像上的点?

    我有一些像素点 比如 p1 1 1 和 p2 1 10 等等 我想以任何颜色在图像上显示这些点 这个怎么做 MATLAB plot http www mathworks com help techdoc ref plot html文档非常全
  • MATLAB:解包函数

    我正在与 Mathworks 的某人讨论 unwrap http www mathworks com access helpdesk help techdoc ref unwrap html函数中对于 以外的跳跃容差有一个 bug 并且希望
  • 我的 matlab 图中需要不同的颜色

    这是我的情节代码 问题是我的图中的两条线具有相同的颜色 我需要为图中的每条线 总共 4 条线 分配一个特殊的颜色 for i 1 nFolderContents data hdrload folderContents i if size f
  • MATLAB 中元胞数组的左连接

    I ve 2 cellMATLAB 中的数组 例如 A jim 4 paul 5 sean 5 rose 1 第二个 B jim paul george bill sean rose 我想做一个 SQL 左连接 这样我就可以得到 B 中的所
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n

随机推荐

  • response.authResponse 为 null

    我编写了以下代码来检查 facebook 的登录状态 FB getLoginStatus function response if response status connected var user id response authRes
  • 为什么 XmlNodeList 是一次性的?

    我找不到这个问题的答案 只是出于好奇 为什么XmlNodeList 类 http msdn microsoft com en us library system xml xmlnodelist 28v vs 110 29 aspx在 NET
  • 如何使用 MsDeploy 设置 iisApp Provider 的部署路径?

    我正在为我的 Web 应用程序创建 Web 部署包 zip 文件 我发现我可以通过在打包站点期间包含 pubxml 并在构建期间使用 PublishProfile 属性来指定该配置文件来指定应用程序的站点名称 pubxml 有
  • 在 Vala 中使用 Glib.Settings 时如何处理错误?

    我在 Vala 应用程序中使用 Glib Settings 我想确保即使架构或密钥不可用 我的程序也能正常工作 所以我添加了一个 try catch 块 但是如果我使用不存在的密钥 程序就会出现段错误 据我了解 它甚至没有到达 catch
  • 层次结构中具有可选元素的 XPath

    正如在这个堆栈溢出答案 https stackoverflow com questions 4608097 xpath to select a table row that has a cell containing specified t
  • TSQL 选择一行或多行进行连接

    这是类似于以下的问题 TSQL 按 2 个条件之一选择行 https stackoverflow com questions 10208849 tsql select rows by one from 2 conditions 但结果与我想
  • Java:如何创建 HTTP 浏览会话

    我正在尝试创建一个向服务器发送一些 POST 请求的 Java 应用程序 第一个请求是带有身份验证信息的请求 然后 当我发送下一个请求时 我得到的答案是我的会话已过期 但我在同一秒内发送下一个请求 所以它不能超时 所以我猜想 Java 中有
  • Twitter PHP API 应用程序访问直接消息权限?

    I have set my application permissions as read Write Direct Messages as shown in the figure 我已经保存了这些设置 But when i authent
  • 如何下载并安装 lint?

    有谁知道如何获取 Mac Windows 和 Linux 的 lint sudo port install lint找不到它 我只见过 BSD 的 lint 有splint http www splint org 但是 GPL lint 重
  • 如何列出Excel中三列中值的所有可能组合?

    我有三列 每一列都有不同类型的主数据 如下所示 现在 我想要这三个单元格的所有可能组合 就像 aa kk jj aa kk ff aa ll jj aa ll ff aa mm jj 这可以用公式来完成吗 我发现一个公式有 2 列 但我无法
  • Prism的RegionManager视图切换性能

    我正在对使用 PRISM 库编写的 WPF 应用程序进行性能分析 在此应用程序中 从一个视图导航到另一视图特别慢 尤其是在远离 重 视图时 注意 来回导航时视图会被缓存并且不会重新构造 PRISM 将所有视图保留在 SingleActive
  • 为什么要有移动语义?

    首先我要说的是 我已经阅读了有关移动语义的许多问题中的一些 这个问题不是关于如何使用移动语义 而是问它的目的是什么 如果我没有记错的话 我不明白为什么需要移动语义 背景 我正在实现一个重磅课程 就这个问题而言 它看起来像这样 class B
  • WooCommerce 购物车基于数量的折扣

    在 WooCommerce 中 如何根据购物车中的商品总数设置购物车折扣 例如 1 至 4 件商品 无折扣 5 至 10 件 5 11 至 15 件 10 16 至 20 件商品 15 21 至 25 件商品 20 26 至 30 件商品
  • 使用 Cassandra PasswordAuthenticator 时,DSE OpsCenter 最佳实践失败

    启用 Cassandra 的 PasswordAuthenticator 时 以下最佳实践检查将失败 搜索启用了错误自动提交的节点 启用查询结果缓存的搜索节点 搜索过滤器缓存错误的节点 我的数值符合推荐值 我已经确认 当我在 Cassand
  • 如何在iOS中绘制单点线

    我想知道绘制单点线的最佳方法是什么 我的目标是在 tableViewCell 中绘制这条线 使其看起来就像本机单元格分隔符 我不想使用原生分隔符 因为我想使用不同的颜色和不同的位置 不是底部 起初我使用 1px UIView 并将其着色为灰
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • 如何在 C#、ASP .NET 中修改请求标头

    我正在开发 ASP NET mVC 项目 并且必须更改 HttpHeaders 请参阅下面的代码片段 WebRequest req HttpWebRequest Create myURL HttpWebResponse response H
  • 单击耳机按钮时应用程序崩溃

    我已经构建了一个部署在 android google playstore 中的音频播放器 我正在使用 crashlytics 来监控崩溃和 ANR 最近我遇到了很多 MediaButtonReceiver 崩溃的情况 耳机的咔嗒声在许多设备
  • 如何仅使用CSS和HTML实现带有标题+可滚动侧边栏+可滚动内容的应用程序布局[重复]

    这个问题在这里已经有答案了 我需要构建一个标准的 Web 应用程序 其中包含标题 左侧边栏 如果选项太多则可滚动 和内容大小合适 这是我的尝试 wrapper font size 14px height 100 width 100 marg
  • 使用MATLAB编写一个函数,在二维中实现牛顿法

    我正在尝试编写一个在二维中实现牛顿法的函数 虽然我已经做到了这一点 但我现在必须调整我的脚本 以便我的函数的输入参数必须是列向量 雅可比矩阵 中的 f x 的f x 最初的猜测x0以及函数的公差f x 及其雅可比矩阵位于单独的 m 文件中