Top.Mail.Ru
Ответы

Матлаб не работает программа Error in untitled (line 17) while or((abs(x(1)-x(0))>e),(abs(x(2)-x0(1))>e))

x0= [3;1];
syms xs ys;
df1xs = diff((tan(xs*ys))-(xs.^2),xs);
df1ys = diff((tan(xs*ys))-(xs.^2),ys);
df2xs = diff(0.8*xs.^2+2*(ys.^2)-1,xs);
df2ys = diff(0.8*xs.^2+2*(ys.^2)-1,ys);
f0=[tan(x0(1)*x0(2))-x0(1)^2;0.8*x0(1)^2+2*(x0(2)^2)-1];
df1x=double(subs(subs(df1xs,xs,x0(1)),ys,x0(2)));
df1y=double(subs(subs(df1ys,xs,x0(1)),ys,x0(2)));
df2x=double(subs(subs(df2xs,xs,x0(1)),ys,x0(2)));
df2y=double(subs(subs(df2ys,xs,x0(1)),ys,x0(2)));
w= [df1x df1y; df2x df2y];
det(w);
x=x0-inv(w)*f0;
e=0.0001;
k=1;
while or((abs(x(1)-x(0))>e),(abs(x(2)-x0(1))>e))
x0(1)=x(1);
x0(2)=x(2);
f0=[tan(x0(1)*x0(2))-x0(1)^2;0.8*x0(1)^2+2*(x0(2)^2)-1];
w= [(-sin(x0(1)-1)) 1;1 in(x0(2))];
det(w);
x=x0-inv(w)*f0;
k=k+1;
if(k>100)
break
end
end

По дате
По рейтингу
Аватар пользователя

Ошибка в вашей программе MATLAB связана с индексацией массивов. В MATLAB индексация начинается с 1, а не с 0, поэтому вы получаете ошибку при попытке обратиться к элементу с индексом 0. Ваша строка while or((abs(x(1)-x(0))>e),(abs(x(2)-x0(1))>e)) должна быть изменена на while or((abs(x(1)-x0(1))>e),(abs(x(2)-x0(2))>e)).

1234567891011121314151617181920212223242526272829303132
 x0 = [3; 1]; 
syms xs ys; 
df1xs = diff((tan(xs*ys)) - (xs.^2), xs); 
df1ys = diff((tan(xs*ys)) - (xs.^2), ys); 
df2xs = diff(0.8*xs.^2 + 2*(ys.^2) - 1, xs); 
df2ys = diff(0.8*xs.^2 + 2*(ys.^2) - 1, ys); 
f0 = [tan(x0(1)*x0(2)) - x0(1)^2; 0.8*x0(1)^2 + 2*(x0(2)^2) - 1]; 
df1x = double(subs(subs(df1xs, xs, x0(1)), ys, x0(2))); 
df1y = double(subs(subs(df1ys, xs, x0(1)), ys, x0(2))); 
df2x = double(subs(subs(df2xs, xs, x0(1)), ys, x0(2))); 
df2y = double(subs(subs(df2ys, xs, x0(1)), ys, x0(2))); 
w = [df1x df1y; df2x df2y]; 
det(w); 
x = x0 - inv(w) * f0; 
e = 0.0001; 
k = 1; 
while or((abs(x(1) - x0(1)) > e), (abs(x(2) - x0(2)) > e)) 
    x0(1) = x(1); 
    x0(2) = x(2); 
    f0 = [tan(x0(1) * x0(2)) - x0(1)^2; 0.8 * x0(1)^2 + 2 * (x0(2)^2) - 1]; 
    df1x = double(subs(subs(df1xs, xs, x0(1)), ys, x0(2))); 
    df1y = double(subs(subs(df1ys, xs, x0(1)), ys, x0(2))); 
    df2x = double(subs(subs(df2xs, xs, x0(1)), ys, x0(2))); 
    df2y = double(subs(subs(df2ys, xs, x0(1)), ys, x0(2))); 
    w = [df1x df1y; df2x df2y]; 
    x = x0 - inv(w) * f0; 
    k = k + 1; 
    if (k > 100) 
        break; 
    end 
end 
 
Аватар пользователя
Ученик

Спасибо большое, помогло)

Аватар пользователя
Мудрец

А что вы пытаетесь решить? У вас процесс расходящийся, уже на 11-й итерации значения уходят в область машинной бесконечности.

Аватар пользователя
Мыслитель

Ошибка в вашем коде в строке 17: while or((abs(x(1)-x(0))>e),(abs(x(2)-x0(1))>e)).
Проблема в том, что в MATLAB нет функции or для логических операций. Вместо нее используйте оператор || (логическое ИЛИ).
Вот как нужно исправить строку 17:
while (abs(x(1)-x(0))>e) || (abs(x(2)-x0(1))>e)

Также есть несколько других моментов, на которые стоит обратить внимание:
1. Несоответствие размеров: В строке 23 вы пытаетесь найти обратную матрицу w, но w не является квадратной матрицей. Исправьте ее определение, чтобы она стала квадратной.
2. Ошибка в значении in(x0(2)): В строке 25 вы пытаетесь использовать функцию in, но такой функции в MATLAB нет. Проверьте, какая функция должна быть использована в этом месте.
3. Ошибки в значениях матрицы w: В строках 25 и 26 вы пытаетесь задать значения матрице w. Проверьте, соответствуют ли эти значения вашим функциям.
Вот полный исправленный код:
x0= [3;1];
syms xs ys;
df1xs = diff((tan(xs*ys))-(xs.^2),xs);
df1ys = diff((tan(xs*ys))-(xs.^2),ys);
df2xs = diff(0.8*xs.^2+2*(ys.^2)-1,xs);
df2ys = diff(0.8*xs.^2+2*(ys.^2)-1,ys);
f0=[tan(x0(1)*x0(2))-x0(1)^2;0.8*x0(1)^2+2*(x0(2)^2)-1];
df1x=double(subs(subs(df1xs,xs,x0(1)),ys,x0(2)));
df1y=double(subs(subs(df1ys,xs,x0(1)),ys,x0(2)));
df2x=double(subs(subs(df2xs,xs,x0(1)),ys,x0(2)));
df2y=double(subs(subs(df2ys,xs,x0(1)),ys,x0(2)));
w= [df1x df1y; df2x df2y];
det(w);
x=x0-inv(w)*f0;
e=0.0001;
k=1;
while (abs(x(1)-x(0))>e) || (abs(x(2)-x0(1))>e)
x0(1)=x(1);
x0(2)=x(2);
f0=[tan(x0(1)*x0(2))-x0(1)^2;0.8*x0(1)^2+2*(x0(2)^2)-1];
% Исправьте матрицу w
w = [df1x df1y; df2x df2y];
det(w);
x=x0-inv(w)*f0;
k=k+1;
if(k>100)
break
end
end

Обратите внимание, что код был исправлен только на основе ошибок, которые вы указали. Возможно, есть и другие ошибки, которые не были указаны. Проверьте ваш код на правильность.



Видео по теме