【问题标题】:secant root finder problems割根查找器问题
【发布时间】:2018-02-23 22:15:57
【问题描述】:

我不确定如何获得此结果以在三个变量之间移动/复制数据:

loop1  x=new y=old 
loop2  z=new  x=old

这是我的代码:

clc;
  clear;
 format long;
 x=input('input  high guess:      ');
 y=input('input low guess:      ');    
 N=100;
 P=1;
 T=[];
 for i= 1:N

f1=(x.^3)-(2*x.^2)-(4*x)+8;
f2=(y.^3)-(2*y.^2)-(4*y)+8;
 z=x-(((f1)*(y-x))/(f2-f1));

  Z=(z.^3)-(2*z.^2)-(4*z)+8;
  x=z;
  y=x;
   T=[T;z];

   end

   disp(T);

【问题讨论】:

    标签: matlab variables for-loop


    【解决方案1】:

    您的多项式看起来是x^3 - 2x^2 - 4x + 8 的形式。让我们首先说在 Matlab 中有更简单的方法可以找到它的根源,例如使用 roots function,如下所示:

    x = -100:100;
    y = (x.^3) - (2 .* x.^2) - (4 .* x) + 8;
    r = roots([1 -2 -4 8])
    
    r =
        -2.00000000000000
         1.99999998974515
         2.00000001025485
    

    无论如何,让我们专注于割线法。您应该定义的第一件事是:

    • 可以将您的潜在结果绑定到的容差水平,以检查是否已达到根(例如1e-6
    • 一个匿名函数来表达你的多项式,在这种情况下f = @(x) x^3 - 2*x^2 - 4*x + 8;

    完成后,您可以构建整个脚本:

    clear();
    clc();
    
    com = Inf;
    i = 2;
    n = 100;
    tol = 1e-6;
    
    f = @(x) (x^3) - (2*x^2) - (4*x) + 8;
    
    x(1) = input('Low Guess:     '); 
    x(2) = input('High Guess:    ');
    
    while ((abs(com) > tol) && (n > 0))
        com = f(x(i))*(x(i)-x(i-1))/ (f(x(i)) - f(x(i-1)));
        x(i+1)= x(i) - com;
    
        i = i + 1;
        n = n - 1;
    end
    
    display(['Root X = ' num2str(x(end))]);
    

    输出是:

    Low Guess:     0
    High Guess:    10
    Root X = 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多