필터 지우기
필터 지우기

Почему появилась ошибка?

조회 수: 18 (최근 30일)
Anastasya
Anastasya 2023년 6월 7일
댓글: Anastasya 2023년 6월 9일
Код:
syms x;
f(x) = x - 5 - 1/3*cos(2*x+1) + (2*x)/(2+x^2);
g(x) = x - f(x);
a = 0; b = 1; % интервал, на котором ищем решение
M1 = max(abs(diff(f(x), x, 2))); % оценка модуля производной второго порядка
eps = 1e-5; % заданная точность
N_apr = ceil(log(M1*(b-a)/eps)/log(2)); % априорная оценка числа итераций
x0 = (a+b)/2; % начальное приближение
N_post = 0; % счетчик числа итераций
while true
x1 = g(x0);
N_post = N_post + 1;
if abs(x1-x0) < eps*(1-M1)/M1 % проверка условия окончания итераций
break;
end
x0 = x1;
end
Conversion to logical from sym is not possible.
disp(['Приближенное решение: x = ', num2str(x1)]);
disp(['Число итераций: N = ', num2str(N_post)]);
disp(['Априорная оценка числа итераций: N_apr = ', num2str(N_apr)]);
Ошибка:
Conversion to logical from sym is not possible.
Error in untitled3 (line 14)
if abs(x1-x0) < eps*(1-M1)/M1 % проверка условия окончания итераций
Пыталась поменять в 13 строке на:
if abs(x1-x0) < double(eps)*(1-double(M1))/double(M1)
Тогда выдает ошибку:
Error using symengine
Unable to convert expression containing symbolic variables into double array. Apply 'subs' function
first to substitute values for variables.
Error in sym/double (line 868)
Xstr = mupadmex('symobj::double', S.s, 0);
Error in untitled3 (line 13)
if abs(x1-x0) < double(eps)*(1-double(M1))/double(M1) % проверка условия окончания итераций
Related documentation
  댓글 수: 2
Star Strider
Star Strider 2023년 6월 7일
Perhaps —
% syms x;
f = @(x) x - 5 - 1/3*cos(2*x+1) + (2*x)/(2+x^2);
g = @(x) x - f(x);
a = 0; b = 1; % интервал, на котором ищем решение
M1 = @(x) max(abs(4*del2(f(x)))); % оценка модуля производной второго порядка
eps = 1e-5; % заданная точность
N_apr = @(x) ceil(log(M1(x)*(b-a)/eps)/log(2)); % априорная оценка числа итераций
x0 = (a+b)/2; % начальное приближение
N_post = 0; % счетчик числа итераций
while true
x1 = g(x0);
N_post = N_post + 1;
if abs(x1-x0) < eps*(1-M1(x1))/M1(x1) % проверка условия окончания итераций
break;
end
x0 = x1;
end
disp(['Приближенное решение: x = ', num2str(x1)]);
Приближенное решение: x = 4.4168
disp(['Число итераций: N = ', num2str(N_post)]);
Число итераций: N = 1
disp(['Априорная оценка числа итераций: N_apr = ', num2str(N_apr(x1))]);
Априорная оценка числа итераций: N_apr = -Inf
.
Anastasya
Anastasya 2023년 6월 9일
Почему то N_apr = -inf. Подскажите как исправить это?

댓글을 달려면 로그인하십시오.

답변 (1개)

Alan Stevens
Alan Stevens 2023년 6월 7일
Seems overcomplicated for a numerical solution! How about simply
f = @(x) x - 5 - 1/3*cos(2*x+1) + 2*x./(2+x.^2);
g = @(x) x - f(x);
a = 0; b = 1; % интервал, на котором ищем решение
eps = 1e-5; % заданная точность
x0 = (a+b)/2; % начальное приближение
N_post = 0; % счетчик числа итераций
while true
x1 = g(x0);
N_post = N_post + 1;
if abs(x1-x0) < eps % проверка условия окончания итераций
break;
end
x0 = x1;
end
disp(['Approximate Solution: x = ', num2str(x1)]);
Approximate Solution: x = 4.2431
disp(['Number of iterations: N = ', num2str(N_post)]);
Number of iterations: N = 7

카테고리

Help CenterFile Exchange에서 Assumptions에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by