итерация методом секущей с допуском
Я пытаюсь выяснить, сколько итераций требуется, когда я запускаю секущую итерацию до определенного допуска в клене. Однако я получаю код ошибки, поэтому, если кто-то может указать, где ошибка в моем коде, я был бы очень признателен.
с уважением.
x0 = 1,22, x1 = 0,8843478306, допуск 1*e-6 > abs(x1-x0) сколько итераций до достижения допуска?
restart;
secant:=proc(f,x0,x1)
local k,x;
x[0]:=x0;
x[1]:=x1;
print(0,x[0]);
print(1,x[1]);
for k from 2 to 1e-6 > abs(x1-x0) do
x[k]:=x[k-1]-f(x[k-1])*(x[k-1]-x[k-2])/(f(x[k-1])-f(x[k-2]));
print(k,x[k]);
end do;
return x;
end proc;
f1:= x -> 3.0*exp(-1.0*x)-(4.1)*x^2;
y := secant(f1, 1.22, 0.8843478306)
Error, (in secant) final value in for loop must be numeric or character
1 ответ
Решение
Я поставил ваше состояние (проверка на переносимость) в
while
условный тест. Я также добавил жестко заданное верхнее значение для
k
индекс цикла как
20
, так что он не убежит навсегда для примера, который не сходится.
Проверьте его, чтобы понять, как / почему это работает, и не допустил ли я ошибок.
restart;
secant:=proc(f,x0,x1)
local k,x;
x[0]:=x0;
x[1]:=x1;
print(0,x[0]);
print(1,x[1]);
for k from 2 to 20 while abs(x[k-1]-x[k-2]) > 1e-6 do
x[k]:=x[k-1]
-f(x[k-1])*(x[k-1]-x[k-2])/(f(x[k-1])-f(x[k-2]));
print(k,x[k],abs(x[k]-x[k-1]));
end do;
return convert(x,list);
end proc:
f1:= x -> 3.0*exp(-1.0*x)-(4.1)*x^2:
secant(f1, 1.22, 0.8843478306);
0, 1.22
1, 0.8843478306
2, 0.6810954056, 0.2032524250
3, 0.6318451478, 0.0492502578
4, 0.6257917558, 0.0060533920
5, 0.6256275429, 0.0001642129
-7
6, 0.6256270427, 5.002 10
[1.22, 0.8843478306, 0.6810954056, 0.6318451478,
0.6257917558, 0.6256275429, 0.6256270427]