Таблица из функции с циклом while [MATLAB]

#matlab #datatable

Вопрос:

Я написал код, который дает мне ноль в интервале функций. В этом коде используется комбинированный метод Ньютона и методы деления пополам.

Вот мой код,

 function p = newtonbisection(f, df, a, b, tol)
p = a;
while abs(f(p)) >= tol
if a <= p amp;amp; b<= p
    p = p - f(p)/df(p);
else
    p = (a b)/2;
end
if f(p)*f(b)<0
    a = p;
else 
    b = p;
end
end
end
 

Я протестировал этот код и он отлично работает. Однако, если я хочу создать таблицу в файле .txt с выводами {метод, используемый для каждого итератора (Ньютона или деления пополам), a, b, p, f(p)} с каждой итерации, что мне нужно добавить?

Я мог бы получить нужные данные, которые мне нужны, в окне командной строки (с кодом ниже), но у меня возникли проблемы с созданием реальной таблицы с помощью Matlab.

 function p = newtonbisection(f, df, a, b, tol)
p = a;
iter = 0;
while abs(f(p)) >= tol
if a <= p amp;amp; b<= p
    p = p - f(p)/df(p);
    iter = iter 1;
    fprintf("newtonn")
else
    p = (a b)/2;
    iter = iter 1;
    fprintf("bisectionn")
end
if f(p)*f(b)<0
    a = p;
else 
    b = p;
end
iter
a 
b
p
disp(f(p))
end
end
 

Могу я получить какую-нибудь помощь?

Ответ №1:

Есть несколько способов сделать это. Простым подходом было бы:

  • предварительно распределите свою таблицу (для целей производительности, см. Предварительное распределение документа)
  • добавьте соответствующие значения для каждой итерации в таблицу
  • удалите оставшиеся строки и сохраните таблицу в txt-файле

Пример:

 function p = newtonbisection(f, df, a, b, tol)
p = a;
iter = 0;

noRowsPreAll = 1000000;
sz = [noRowsPreAll 6];
varTypes = {'int32','categorical','double','double','double','double'};
varNames = {'step', 'method', 'a', 'b', 'p','f(p)'};
T = table('Size',sz,'VariableTypes',varTypes,'VariableNames', varNames);

while abs(f(p)) >= tol
    iter = iter 1;
    if iter > noRowsPreAll
        disp('Warning: preallocate a bigger table!')
    end
    T.step(iter) = iter;
    
    if a <= p amp;amp; b<= p
        p = p - f(p)/df(p);
        T.method(iter) = 'newton';
    else
        p = (a b)/2;
        T.method(iter) = 'bisection';
    end
    if f(p)*f(b)<0
        a = p;
    else
        b = p;
    end
    
    T.a(iter) = a;
    T.b(iter) = b;
    T.p(iter) = p;
    T.("f(p)")(iter) = f(p);
end

T(iter 1:end,:) = [];
writetable(T, 'output.txt')
end