Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pascal 我需要一些建议_Pascal_Numerical Methods_Runge Kutta - Fatal编程技术网

Pascal 我需要一些建议

Pascal 我需要一些建议,pascal,numerical-methods,runge-kutta,Pascal,Numerical Methods,Runge Kutta,我不明白代码中哪里有错误,老师写道“在区间(1,3)中没有根,在程序中查找错误。”我需要你的帮助来指出我的错误在哪里。因为我真的已经在这项任务中受苦了,如果你能帮助我,我将非常感激 任务 编写一个程序: a) 从第1点中发现的隔离间隔中,以0.001的精度,通过以下方式找到给定非线性方程的k-最小正根:对半(如果您的姓氏以元音字母开头)、和弦(如果您的姓氏以辅音字母开头) b) 采用四阶龙格-库塔法在区间[0;2]内以10-4的精度求解微分方程(为达到规定的精度,采用双转换法,初始解步等于1)

我不明白代码中哪里有错误,老师写道“在区间(1,3)中没有根,在程序中查找错误。”我需要你的帮助来指出我的错误在哪里。因为我真的已经在这项任务中受苦了,如果你能帮助我,我将非常感激

任务

  • 编写一个程序:
    • a) 从第1点中发现的隔离间隔中,以0.001的精度,通过以下方式找到给定非线性方程的k-最小正根:对半(如果您的姓氏以元音字母开头)、和弦(如果您的姓氏以辅音字母开头)
    • b) 采用四阶龙格-库塔法在区间[0;2]内以10-4的精度求解微分方程(为达到规定的精度,采用双转换法,初始解步等于1)
    • c) 使用基于在点b)中找到的微分方程解的线性插值,它可以在点处找到函数的近似值
    • d) 通过以下方法确定单位电阻在2个时间单位内释放的热量:辛普森(如果您的名字以元音字母开头)、梯形(如果您的名字以辅音字母开头),增量为0.1
    类型
    Arr=实数的数组[0..100];
    函数f(x:实):实;
    变量
    x2:真实;
    开始
    x2:=Sqr(x);
    f:=3*Sqr(x2)+8*x2*x+6*x2-10;
    结束;
    函数f1(x:Real):Real;
    变量
    x2:真实;
    开始
    x2:=Sqr(x);
    f1:=12*x2*x+24*x2+12*x;
    结束;
    函数f2(x:实):实;
    开始
    f2:=36*Sqr(x)+48*x+12;
    结束;
    函数解(a,b,e:Real;var-it:Integer):Real;
    变量
    x、 g:真的;
    开始
    如果f(a)*f2(a)>0,则开始
    x:=b;
    g:=a;
    结束
    否则开始
    x:=a;
    g:=b;
    结束;
    它:=0;
    重复
    x:=x-f(x)*(g-x)/(f(g)-f(x));
    公司(it);
    直到Abs(f(x))
    
    type
    
     Arr = array[0..100] of Real;
    
    function f(x: Real): Real;
    
    var
      x2: Real;
    begin
      x2 := Sqr(x);
      f := 3 * Sqr(x2) + 8 * x2 * x + 6 * x2 - 10;
    end;
    function f1(x: Real): Real;
    var
      x2: Real;
    begin
      x2 := Sqr(x);
      f1 := 12 * x2 * x + 24 * x2 + 12 * x;
    end;
    function f2(x: Real): Real;
    begin
      f2 := 36 * Sqr(x) + 48 * x + 12;
    end;
    
    function Solution(a, b, e: Real; var it: Integer): Real;
    var
      x, g: Real;
    begin
      if f(a) * f2(a) > 0 then begin
        x := b;
        g := a;
      end
      else begin
        x := a;
        g := b;
      end;
      it := 0;
      repeat
        x := x - f(x) * (g - x) / (f(g) - f(x));    
        Inc(it);
      until Abs(f(x)) <= e;
      Solution := x;
    end;
    
    function Fp(x, y: Real): Real;
    begin
      Fp := 1-sin(3*x + y)+(y/(2+x));
    end;
    procedure Runge(x: Arr; var y: Arr; n: Integer);
    var
      h: Real;
      k1, k2, k3, k4: Real;
      i: Integer;
    begin
      h := x[1] - x[0];
      for i := 1 to n do begin
        k1 := Fp(x[i - 1], y[i - 1]);
        k2 := Fp(x[i - 1] + h / 2, y[i - 1] + h / 2 * k1);
        k3 := Fp(x[i - 1] + h / 2, y[i - 1] + h / 2 * k2);
        k4 := Fp(x[i - 1] + h, y[i - 1] + h * k3);
        y[i] := y[i - 1] + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4);
      end;
    end;
    
    procedure LinInt(x, y, xIp: Arr; var yIp: Arr; n, nIp: Integer);
    var 
      i, j: Integer;
      q, h: Real;
    begin
      h := x[1] - x[0];
      for i := 0 to nIp do begin
        j := 0;
        while (j < n) and (x[j] <= xIp[i]) do
          Inc(j);
        Dec(j);
        q := (xIp[i] - x[j]) / h;
        yIp[i] := y[j] + q * (y[j + 1] - y[j]);
      end;
    end;
    function Trap(a, b: Real; y: Arr; n: Integer): Real;
    var
      h: Real;
      i: Integer;
      sum: Real;
    begin
      h := (b - a) / n;
      sum := 0;
      for i := 1 to n - 1 do
        sum := sum + y[i];
      Trap := h * ((y[0] + y[n]) / 2 + sum);
    end;
    
    const
      e = 0.0001;
      e4 = 15 * e;
      x0 = 0;
      a = 0;
      b = 2;
      hIp = 0.1; 
    var
      y0: Real;
      it: Integer; 
      n: Integer;
      x, y: Arr;
      h: Real; 
      _n: Integer; 
      _x, _y: Arr;
      _h: Real; 
      nIp: Integer; 
      xIp, yIp: Arr;
      ok: Boolean;
      i: Integer;
    begin
      y0 := Solution(0.5, 3, 0.001, it);
      Writeln('k  = ', y0:5:3, ' (iterations= ', it, ')');
    
      x[0] := x0;
      y[0] := y0;  
      _x[0] := x0;
      _y[0] := y0;  
      _n := 1;
      repeat
        _n := _n * 2;
        _h := (b - a) / _n;
        for i := 1 to _n do
          _x[i] := _x[i - 1] + _h;
        Runge(_x, _y, _n); 
        n := _n * 2;
        h := _h / 2;
        for i := 1 to n do
          x[i] := x[i - 1] + h;
        Runge(x, y, n); 
        ok := True;
        for i := 1 to _n do 
          if Abs(_y[i] - y[i * 2]) > e4 then begin
            ok := False;
            Break;
          end;
      until ok;
      Writeln('Results of solving the differential equation:');
      for i := 0 to n do begin
        Writeln('x = ', x[i]:8:4, '  y = ', y[i]:8:4);
        if (i = 20) or (i = 44) then
          Readln;
      end;
      Readln;
      nIp := Trunc((b - a) / hIp);
      xIp[0] := a;
      for i := 1 to nIp do
        xIp[i] := xIp[i - 1] + hIp;
      LinInt(x, y, xIp, yIp, n, nIp);
      Writeln('Results of interpolations:');
      for i := 0 to nIp do begin
        Writeln('x = ', xIp[i]:8:4, ' y = ', yIp[i]:8:4);
        yIp[i] := Sqr(yIp[i]);
      end;
      Writeln('Amount of heat Q=', Trap(a, b, yIp, nIp):8:4);
      Readln;
    end.