% ===== Helper function for Octave =====
% This replaces MATLAB's "poly2str" (not available in Octave).
function s = poly2str_oct(coeffs, varname)
n = length(coeffs);
terms = {};
for i = 1:n
c = coeffs(i);
p = n - i;
if abs(c) < 1e-12, continue; end
if p == 0
terms{end+1} = sprintf('%+g', c);
elseif p == 1
terms{end+1} = sprintf('%+g*%s', c, varname);
else
terms{end+1} = sprintf('%+g*%s^%d', c, varname, p);
end
end
% Join terms, remove leading "+"
s = strjoin(terms, ' ');
if s(1) == '+', s = s(2:end); end
end
% ===== Main Script =====
% Polynomial: a*x^3 + b*x^2 + c*x + d
a = 1; b = -9; c = 0; d = 3.8197;
coeffs = [a b c d];
coeffs0 = coeffs;
% Initial guesses for each root
x0_list = [rand()*10, rand()*10, rand()*10];
maxiter = 50;
tol = 5e-4; % 0.0005 => correct to 3 dp
roots_found = zeros(1,3);
% Show original polynomial
pstr = poly2str_oct(coeffs0, 'x'); % <-- use helper function
fprintf('f(x) = %s = 0\n', pstr);
for root_index = 1:3
fprintf('\n=== Root %d ===\n', root_index);
dcoeffs = polyder(coeffs);
x = x0_list(root_index);
% Table header
fprintf('iter x_i f(x_i) f''(x_i) |x_{i+1}-x_i|\n');
for it = 1:maxiter
fval = polyval(coeffs, x);
fpval = polyval(dcoeffs, x);
xnew = x - fval / fpval;
delta = abs(xnew - x);
% Truncate to 5 dp
xt5 = fix(x*1e5)/1e5;
f5 = fix(fval*1e5)/1e5;
fp5 = fix(fpval*1e5)/1e5;
d5 = fix(delta*1e5)/1e5;
% Print iteration
fprintf('%3d %12.5f %14.5f %14.5f %14.5f\n', it, xt5, f5, fp5, d5);
if delta < tol
x = xnew;
break;
end
x = xnew;
end
roots_found(root_index) = x;
% Deflate by (x - root) unless this was the last root
if root_index < 3
[q, ~] = deconv(coeffs, [1, -x]);
coeffs = q;
% Show remaining polynomial
q_show = poly2str_oct(fix(coeffs*1e5)/1e5, 'x');
fprintf('Remaining polynomial after dividing by (x - %.5f): %s = 0\n', fix(x*1e5)/1e5, q_show);
end
end
% Final roots
fprintf('\n=== All Roots (5 dp with 3 dp in parentheses) ===\n');
for k = 1:length(roots_found)
r5 = fix(roots_found(k)*1e5)/1e5;
r3 = fix(roots_found(k)*1e3)/1e3;
fprintf('Root %d = %.5f (%.3f)\n', k, r5, r3);
end
JSA9PT09PSBIZWxwZXIgZnVuY3Rpb24gZm9yIE9jdGF2ZSA9PT09PQolIFRoaXMgcmVwbGFjZXMgTUFUTEFCJ3MgInBvbHkyc3RyIiAobm90IGF2YWlsYWJsZSBpbiBPY3RhdmUpLgpmdW5jdGlvbiBzID0gcG9seTJzdHJfb2N0KGNvZWZmcywgdmFybmFtZSkKICAgIG4gPSBsZW5ndGgoY29lZmZzKTsKICAgIHRlcm1zID0ge307CiAgICBmb3IgaSA9IDE6bgogICAgICAgIGMgPSBjb2VmZnMoaSk7CiAgICAgICAgcCA9IG4gLSBpOwogICAgICAgIGlmIGFicyhjKSA8IDFlLTEyLCBjb250aW51ZTsgZW5kCiAgICAgICAgaWYgcCA9PSAwCiAgICAgICAgICAgIHRlcm1ze2VuZCsxfSA9IHNwcmludGYoJyUrZycsIGMpOwogICAgICAgIGVsc2VpZiBwID09IDEKICAgICAgICAgICAgdGVybXN7ZW5kKzF9ID0gc3ByaW50ZignJStnKiVzJywgYywgdmFybmFtZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0ZXJtc3tlbmQrMX0gPSBzcHJpbnRmKCclK2cqJXNeJWQnLCBjLCB2YXJuYW1lLCBwKTsKICAgICAgICBlbmQKICAgIGVuZAogICAgJSBKb2luIHRlcm1zLCByZW1vdmUgbGVhZGluZyAiKyIKICAgIHMgPSBzdHJqb2luKHRlcm1zLCAnICcpOwogICAgaWYgcygxKSA9PSAnKycsIHMgPSBzKDI6ZW5kKTsgZW5kCmVuZAoKJSA9PT09PSBNYWluIFNjcmlwdCA9PT09PQolIFBvbHlub21pYWw6IGEqeF4zICsgYip4XjIgKyBjKnggKyBkCmEgPSAxOyBiID0gLTk7IGMgPSAwOyBkID0gMy44MTk3Owpjb2VmZnMgPSBbYSBiIGMgZF07CmNvZWZmczAgPSBjb2VmZnM7CgolIEluaXRpYWwgZ3Vlc3NlcyBmb3IgZWFjaCByb290CngwX2xpc3QgPSBbcmFuZCgpKjEwLCByYW5kKCkqMTAsIHJhbmQoKSoxMF07CgptYXhpdGVyICA9IDUwOwp0b2wgICAgICA9IDVlLTQ7ICAgJSAwLjAwMDUgPT4gY29ycmVjdCB0byAzIGRwCgpyb290c19mb3VuZCA9IHplcm9zKDEsMyk7CgolIFNob3cgb3JpZ2luYWwgcG9seW5vbWlhbApwc3RyID0gcG9seTJzdHJfb2N0KGNvZWZmczAsICd4Jyk7ICAgJSA8LS0gdXNlIGhlbHBlciBmdW5jdGlvbgpmcHJpbnRmKCdmKHgpID0gJXMgPSAwXG4nLCBwc3RyKTsKCmZvciByb290X2luZGV4ID0gMTozCiAgICBmcHJpbnRmKCdcbj09PSBSb290ICVkID09PVxuJywgcm9vdF9pbmRleCk7CgogICAgZGNvZWZmcyA9IHBvbHlkZXIoY29lZmZzKTsKICAgIHggPSB4MF9saXN0KHJvb3RfaW5kZXgpOwoKICAgICUgVGFibGUgaGVhZGVyCiAgICBmcHJpbnRmKCdpdGVyICAgICAgICB4X2kgICAgICAgICAgICAgZih4X2kpICAgICAgICAgICBmJycoeF9pKSAgICAgICAgfHhfe2krMX0teF9pfFxuJyk7CgogICAgZm9yIGl0ID0gMTptYXhpdGVyCiAgICAgICAgZnZhbCAgPSBwb2x5dmFsKGNvZWZmcywgIHgpOwogICAgICAgIGZwdmFsID0gcG9seXZhbChkY29lZmZzLCB4KTsKICAgICAgICB4bmV3ICA9IHggLSBmdmFsIC8gZnB2YWw7CiAgICAgICAgZGVsdGEgPSBhYnMoeG5ldyAtIHgpOwoKICAgICAgICAlIFRydW5jYXRlIHRvIDUgZHAKICAgICAgICB4dDUgPSBmaXgoeCoxZTUpLzFlNTsKICAgICAgICBmNSAgPSBmaXgoZnZhbCoxZTUpLzFlNTsKICAgICAgICBmcDUgPSBmaXgoZnB2YWwqMWU1KS8xZTU7CiAgICAgICAgZDUgID0gZml4KGRlbHRhKjFlNSkvMWU1OwoKICAgICAgICAlIFByaW50IGl0ZXJhdGlvbgogICAgICAgIGZwcmludGYoJyUzZCAgICUxMi41ZiAgICUxNC41ZiAgICUxNC41ZiAgICUxNC41ZlxuJywgaXQsIHh0NSwgZjUsIGZwNSwgZDUpOwoKICAgICAgICBpZiBkZWx0YSA8IHRvbAogICAgICAgICAgICB4ID0geG5ldzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZW5kCiAgICAgICAgeCA9IHhuZXc7CiAgICBlbmQKCiAgICByb290c19mb3VuZChyb290X2luZGV4KSA9IHg7CgogICAgJSBEZWZsYXRlIGJ5ICh4IC0gcm9vdCkgdW5sZXNzIHRoaXMgd2FzIHRoZSBsYXN0IHJvb3QKICAgIGlmIHJvb3RfaW5kZXggPCAzCiAgICAgICAgW3EsIH5dID0gZGVjb252KGNvZWZmcywgWzEsIC14XSk7CiAgICAgICAgY29lZmZzID0gcTsKCiAgICAgICAgJSBTaG93IHJlbWFpbmluZyBwb2x5bm9taWFsCiAgICAgICAgcV9zaG93ID0gcG9seTJzdHJfb2N0KGZpeChjb2VmZnMqMWU1KS8xZTUsICd4Jyk7CiAgICAgICAgZnByaW50ZignUmVtYWluaW5nIHBvbHlub21pYWwgYWZ0ZXIgZGl2aWRpbmcgYnkgKHggLSAlLjVmKTogJXMgPSAwXG4nLCBmaXgoeCoxZTUpLzFlNSwgcV9zaG93KTsKICAgIGVuZAplbmQKCiUgRmluYWwgcm9vdHMKZnByaW50ZignXG49PT0gQWxsIFJvb3RzICg1IGRwIHdpdGggMyBkcCBpbiBwYXJlbnRoZXNlcykgPT09XG4nKTsKZm9yIGsgPSAxOmxlbmd0aChyb290c19mb3VuZCkKICAgIHI1ID0gZml4KHJvb3RzX2ZvdW5kKGspKjFlNSkvMWU1OwogICAgcjMgPSBmaXgocm9vdHNfZm91bmQoaykqMWUzKS8xZTM7CiAgICBmcHJpbnRmKCdSb290ICVkID0gJS41ZiAoJS4zZilcbicsIGssIHI1LCByMyk7CmVuZAo=