Matlab 定点迭代求根时输出错误

Matlab 定点迭代求根时输出错误,matlab,numerical-methods,Matlab,Numerical Methods,我有一个方程g=@(x)(5-((5/2)*exp(x/2))-((7/2).x^2)-3*x)。^1/3,根据规范,方程有3个根。但是为了得到固定点,我的输出在x和g(x)之间没有任何匹配。输出: >> fpi1(g, 0.5, 20) x0 g(x0) 0.500000000000000 0.670818823114861 - 1.161892

我有一个方程
g=@(x)(5-((5/2)*exp(x/2))-((7/2).x^2)-3*x)。^1/3
,根据规范,方程有3个根。但是为了得到固定点,我的输出在x和g(x)之间没有任何匹配。输出:

>> fpi1(g, 0.5, 20)
   x0                                           g(x0)
  0.500000000000000                       0.670818823114861 - 1.161892284308499i
  0.670818823114861 - 1.161892284308499i  1.281297751181495 - 1.559064591427071i
  1.281297751181495 - 1.559064591427071i  1.864118571141893 - 1.621766955715062i
  1.864118571141893 - 1.621766955715062i  2.320549078066838 - 1.504496934526923i
  2.320549078066838 - 1.504496934526923i  2.646646533032701 - 1.316018792060223i
  2.646646533032701 - 1.316018792060223i  2.870437643388612 - 1.115036747500670i
  2.870437643388612 - 1.115036747500670i  3.021682102842603 - 0.927806240969038i
  3.021682102842603 - 0.927806240969038i  3.123528510261589 - 0.763760920462736i
  3.123528510261589 - 0.763760920462736i  3.192243659445853 - 0.624547007383635i
  3.192243659445853 - 0.624547007383635i  3.238827490411373 - 0.508525243060542i
  3.238827490411373 - 0.508525243060542i  3.270613725640807 - 0.412880979787002i
  3.270613725640807 - 0.412880979787002i  3.292471687008435 - 0.334576282706924i
  3.292471687008435 - 0.334576282706924i  3.307635263738642 - 0.270756021961336i
  3.307635263738642 - 0.270756021961336i  3.318257296190301 - 0.218898831715851i
  3.318257296190301 - 0.218898831715851i  3.325776161489184 - 0.176850650328430i
  3.325776161489184 - 0.176850650328430i  3.331157314339334 - 0.142806525903066i
  3.331157314339334 - 0.142806525903066i  3.335052371178708 - 0.115272146831085i
  3.335052371178708 - 0.115272146831085i  3.337903988543196 - 0.093020017690524i
  3.337903988543196 - 0.093020017690524i  3.340015124633794 - 0.075047094363536i
  3.340015124633794 - 0.075047094363536i  3.341594884710001 - 0.060536697645525i
  3.341594884710001 - 0.060536697645525i  3.342788954448884 - 0.048825574318716i
我做错了什么?怎么能修好呢

%Program 1.2 Fixed-Point Iteration
%Computes approximate solution of g(x)=x
%Input: inline function g, starting guess x0, 
%       number of steps k
%Output: Approximate solution xc
function xc=fpi1(g,x0,k)
x(1)=x0;
for i=1:k
  x(i+1)=g(x(i));
end
xc=x(k+1);
disp('   x0                                           g(x0)');
disp([x', g(x)']);

在我开始之前只需要一个小纸条。您的
g
函数中有一个输入错误。我想你是指
(7/2)*
而不是
(7/2)。
。我还必须编辑您的代码,以允许电源操作按元素运行:

g = @(x)(5-((5/2).*exp(x/2))-((7/2)*x.^2)-3*x).^1/3;
用这个修正后的函数进行一些初始测试,使其与您得到的匹配


在任何情况下,使用定点迭代来查找方程的根都是不正确的。在我讨论您需要做什么来修复它之前,我想先介绍定点迭代是如何工作的,以便您(以及阅读本文的其他人)了解我的来历

定点迭代基于初始输入值
x0
。然后,在将该值提交到函数后,重复计算该值的输出,然后在下一次迭代中将该输出重新用作输入。具体而言,定点迭代方案执行以下操作:

资料来源:

理想情况下,在一些迭代之后,我们希望迭代收敛到某个值
x
,以便:

资料来源:

以上就是不动点的定义。这样做找根(本机)不受支持,因为找方程的根与不动点的假设相矛盾。根的定义是当
f(x)=0
时,这不是一个固定点,除非
x=0
。如果要使用定点迭代来查找根,则必须更改函数
f
的结构方式。这就引出了经典的迭代寻根技术,它也使用定点迭代来寻找函数的根,但是函数
f(x)
是不同的

我将不讨论牛顿方法的推导,但这是您在每次迭代中所做的:

资料来源:

f(x)
是函数,
f'(x)
f(x)
的导数。如果我们用一个新函数
g(x)
替换右侧,您将在函数
g(x)
上执行定点迭代,收敛后的结果就是您要查找的根。具体而言,如果:

资料来源:

然后:

资料来源:

因此:

资料来源:

。。。并且
x
是函数
f(x)
的根,如果:

资料来源:

因此,您需要修改代码,使其不再具有函数句柄。它必须采用符号版本,因为需要对函数求导

请记住,为了使代码正常工作,您需要对代码进行以下修改:

%//Program 1.2 Fixed-Point Iteration via Newton's Method
%//Computes approximate root of g(x)=0
%//Input: symbolic function g, starting guess x0, 
%//       number of steps k
%//Output: Approximate solution xc

format long g; %// For precision
x(1)=x0;
gp = diff(g); %// Change
for i=1:k
    gval = double(subs(g, 'x', x(i))); %// Change
    gpval = double(subs(gp, 'x', x(i))); %// Change
    x(i+1)= x(i) - (gval/gpval); %// Change
end
xc=x(k+1);
y = double(subs(g, 'x', x)); %// Change
disp('                        x0                      g(x0)');
disp([x' y'])
不同的是,在函数内部,你可以用符号找到导数。此外,如果要将值替换到函数中,则需要使用,然后将结果强制转换为
double
。我还假设你的函数是关于变量
x

最后一行代码将所有累积的
x
值转换为
double
数组以供显示

要运行此代码,请执行以下操作:

syms x;
g = (5-((5/2)*exp(x/2))-((7/2)*x^2)-3*x)^1/3;
xc = fpi(g, 0.5, 20);
请注意,您不再需要元素操作符,因为我们正在处理符号方程

我们得到:

>> fpi(g, 0.5, 20)
                        x0                      g(x0)
                       0.5        -0.195021180573118
         0.427814775036064       -0.0067677938874851
          0.42512303212814     -9.38738903072792e-06
         0.425119288112029     -1.81600035806892e-11
         0.425119288104786     -5.28061163184459e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17
         0.425119288104786      1.52806116318446e-17

所以其中一个根等于
0.425119288104786
。右边的一栏告诉您每次迭代在
g(x)
处的值是多少,您可以看到它非常小。。。几乎是零。这或多或少是根的定义。

你的
g(x)
公式中的
(7/2).x^2
给了我一个错误,因为你试图在标量上使用运算符
。你想用什么运算符呢?@ClarissaG,但是当我不使用运算符
时,Matlab会给我一个错误,告诉我使用运算符
@ClarissaG时,
输入必须是标量和方阵。若要计算元素幂,请使用幂(.^)。
请仔细检查函数,其中存在语法错误(
错误:意外的MATLAB运算符。
)更正后的函数应为:
g=@(x)(5-((5/2)。*exp(x/2))-((7/2)*x.^2)-3*x)。^1/3
(7/2)
后面的点应该是乘法,幂运算符应该是元素:
^
。谢谢你所做的一切,@rayryeng!最后一个问题,如果r=g(r),f(r)=0(f(r)必须等于0)吗?非常接近。如果你用的是牛顿法,
g(r)=r-f(r)/f'(r)
<如果
f(r)/f'(r)=0,则code>r
是根。牛顿的方法与定点迭代一起工作,以在每次迭代中最小化该项。