Перевести Matlab в Mathematica, итерация с фиксированной точкой - PullRequest
0 голосов
/ 02 мая 2018

Это мой код Matlab:

clear;clc;format ('long','g')
i=1;
x(i)=0;
error(i) = 9999;

while error(i) >= 0.05
    x(i+1) = (0.2062129)*(20+(2*x(i)))^(2/5);
    error(i+1)=abs((((x(i+1)-x(i))/(x(i+1)))*100));
    i=i+1;
end

disp('           root                 error(%)');
disp([x',error'])

Как мне перевести это в Mathematica, чтобы он генерировал список корней и ошибок, как это происходит в matlab?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я бы посоветовал вместо того, чтобы похоронить тест на сходимость в функции, которую вы делаете следующим образом:

f[xi_] := 0.2062129*(20 + (2*xi))^(2/5)
NestWhileList[f, 0, Abs[(#2 - #1)/#2*100] >= .05 &, 2]

{0, 0,683483, 0,701799, 0,70228, 0,702293}

Вы также можете сделать:

FixedPointList[f, 0, SameTest -> (Abs[(#2 - #1)/#2*100] < .05 &)]

Обратите внимание, что в обоих случаях вы можете использовать FixedPoint и NestWhile, если вам нужен только конечный результат, а не список промежуточных значений.

0 голосов
/ 02 мая 2018

Поскольку у нас нет вывода, который вы получили от Matlab, трудно понять, достаточно ли это правильно или нет. Сравните это с тем, что у вас есть, и идите оттуда.

expr={1,0,9999};
f[{i_,xi_,err_}]:=(xipp=0.2062129*(20+(2*xi))^(2/5);
  {i+1,xipp,Abs[(((xipp-xi)/(xipp))*100)]});
NestWhileList[f,expr,#[[3]]>=.05&]

, который за долю секунды возвращает

{{1,0,9999},
 {2,0.683483,100.},
 {3,0.701799,2.60989},
 {4,0.70228,0.0684954},
 {5,0.702293,0.00179788}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...