北大寒假學(xué)堂2019年一道數(shù)學(xué)題的三種解法: 北太天元,常規(guī)做法,數(shù)形結(jié)合

%北太天元求解北大寒假學(xué)堂2019年數(shù)學(xué)題
% 設(shè) |z| = 1, 且滿足?z^17 + z - 1 = 0 ,求 z = __.
%系數(shù)
a = zeros(1,18);
?a(1) = 1; % z^17 的系數(shù)
a(end-1) = 1; % z 的系數(shù)
a(end) = -1;???% 常數(shù)項(xiàng)
% 求17次一元多項(xiàng)式的所有根
r = roots(a);
%計(jì)算所有的根的模
模 = abs(r);
% 找出 模和 1 接近的根
[ind, r1 ] = find(?abs(?模 - 1?) < sqrt(eps) ) ;
for i = ind
???fprintf( "%s?+ i %s \n",???genshiEx1(real(r(i))) , genshiEx1(imag(r(i)))?);
end
% 北太天元用一個(gè)根式逼近浮點(diǎn)數(shù)
%?( m sqrt(p) + k sqrt(q) )/ n
% 例如 sin(15度) = ( sqrt(6)-sqrt(2) ) /4
% x?= sin(deg2rad(15))?
% genshiEx1(x);
function?[str, m,p,k,q,n] = genshiEx1(x)
???if(nargin ~= 1)
??????help genshiEx1;
??????return;
???end
???if( abs(x) >= 1)
??????fprintf("僅僅對(duì)|x|<1 來做逼近,因此下面做的是 rem(%f,1)\n", x);
??????x = rem(x,1);
???end???
???% 設(shè)定忍量
???tol = 1e-7;
???%暴力搜索
???% 設(shè)定暴力搜索的范圍
???N = 10;
???for n = 1:N
??????for m = 0:n
?????????for k = 0:n
????????????for p = 0:3*n
???????????????for q = 0:3*n
??????????????????x0 = (m*sqrt(p) +k*sqrt(q))/n;
??????????????????x1 = (-m*sqrt(p)+k*sqrt(q))/n;
??????????????????%x2 = (m*sqrt(p)-k*sqrt(q))/n;
??????????????????%x3 = (-m*sqrt(p)-k*sqrt(q))/n;
??????????????????A = [x0, x1, -x1, -x0];
??????????????????[r,c] = find( abs(A-x) < tol );
??????????????????if length(c) > 0
?????????????????????col = c(1);
?????????????????????if(col == 1)
????????????????????????%fprintf("(%d sqrt(%d)+%d sqrt(%d))/%d\n" , m, p, k, q, n);
????????????????????????str = [ '(', num2str(m,0), ' x sqrt(', num2str(p,0), ')', '+', num2str(k,0), ...
??????????????????????????????' x sqrt(', num2str(q), '))/', num2str(n,0)];??????
?????????????????????elseif (col == 2)
????????????????????????%fprintf("(-%d sqrt(%d)+%d sqrt(%d))/%d\n" , m, p, k, q, n);
????????????????????????str = [ '(-', num2str(m,0), ' x sqrt(', num2str(p,0), ')', '+', num2str(k,0), ...
??????????????????????????????' x sqrt(', num2str(q), '))/', num2str(n,0)];??????
?????????????????????elseif (col == 3)
????????????????????????%fprintf("(%d sqrt(%d)-%d sqrt(%d))/%d\n" , m, p, k, q, n);
????????????????????????str = [ '(', num2str(m,0), ' x sqrt(', num2str(p,0), ')', '-', num2str(k,0), ...
??????????????????????????????' x sqrt(', num2str(q), '))/', num2str(n,0)];??????
?????????????????????elseif (col == 4)
????????????????????????%fprintf("(-%d sqrt(%d)-%d sqrt(%d))/%d\n" , m, p, k, q, n);
????????????????????????str = [ '(-', num2str(m,0), ' x sqrt(', num2str(p,0), ')', '-', num2str(k,0), ...
??????????????????????????????' x sqrt(', num2str(q), '))/', num2str(n,0)];??????
?????????????????????end
?????????????????????return;
??????????????????end
???????????????end
????????????end
?????????end
??????end
???end
???fprintf("根式逼近沒有成功, 你可以試試對(duì)x^2 來逼近\n");
???str = num2str(x);
???m =0;
???p = 0;
???k = 0;
???q = 0;
???n = 0;
end