• Регистрация
Georgyu
Georgyu 0.00
н/д

Помогите с ошибкой

19.11.2019
Мне нужно найти методом бисекции точку пересечения двух функций y1=sinh(2*x-1) и y2=2*sin(-2*x) на интервале x=-2:2 с точностью не менее 0,001. Я написал скрипт, но он выдает ошибку: Unable to perform...

Мне нужно найти методом бисекции точку пересечения двух функций y1=sinh(2*x-1) и y2=2*sin(-2*x) на интервале x=-2:2 с точностью не менее 0,001. Я написал скрипт, но он выдает ошибку: Unable to perform assignment because the left and right sides have a different number of elements. Что делать? Вот скрипт:

%Ввод исходных данных

%Y1=sinh(2*x-1) %Y2=2*sin(-2*x)



%eps=1.E-3

%eps=1.E-4

eps=1.E-3;

dx=1;

x=-2:2;

%Нахождение отрезка, длинной 0.1, включающего точку пересечения графиков заданных функций

i=0;

while dY<0;

i=i+1;

xt(i)=x;

Y1=sinh(2*x-1);

Y2=2*sin(-2*x);

Y1=yt1(i);

Y2=yt2(i);

dY=Y1-Y2;

x=x+dx;

end;

%Нахождение границ отрезка и значений функций на его концах

y1r(1)=yt1(i);

y1r(2)=yt1(i-1);

y2r(1)=yt2(i);

y2r(2)=yt2(i-1);

xr(1)=xt(i-1);

xr(2)=xt(i);

for n=1:2, xrt(n)=xr(n)

end;%Нахождение точки пересечения графиков исходных функций с заданной точностью с помощью метода деления отрезка пополам

j=1;

while abs(dY)>eps;

xc=(xr(1)+xr(2))/2;

Y1=sinh(2*x-1);

Y2=2*sin(-2*x);

dY=Y1-Y2;

if dY>0 xr(1)=xc;

else xr(2)=xc;

end;

%Вывод данных на экран

j=j+1;

end;

disp('Исходные данные'); 

disp('xc='); disp(xc);

disp('Y1='); disp(Y1);

disp('Y2='); disp(Y2);

disp('Шагов='); disp(j);

disp('Eps='); disp(eps);

%Вывод графика



plot(xrt,y1r,xrt,y2r);

Теги

    19.11.2019

    Комментарии

    • kurguz
      kurguz+270.00
      19.11.2019 10:04

      Ваш код не работает из-за неопределенных переменных dY и yt1.

      Задачу можно решить так:

      >> syms x y
      >> fplot([sinh(2*x-1); 2*sin(-2*x)], [-2 2]), grid;
      >> [solx,soly] = vpasolve(y == sinh(2*x-1), y == 2*sin(-2*x), [-2 2])
      
      solx =
      0.1767692387954752913431843497846
       
      soly =
      -0.69243920626747078920916372637093
      

      Если вы хотите задать специфическую точность, можно например округлить полученные значения:

      >> format long
      >> x = round(double(solx),4)
      >> y = round(double(soly),4)
      >> format short
      
      x =
         0.176800000000000
      
      y =
        -0.692400000000000
      

      • Centurio
        Centurio+42.00
        20.11.2019 13:05

        Вот код для решения методом бисекции:

        f1=@(x)sinh(2*x-1);

        f2=@(x)2*sin(-2*x);

        f=@(x)f1(x)-f2(x);

        ab=[-2 2];

        ep=1e-3;

        m=sum(ab)/2;

        y=f(m);

        while abs(y)>ep

            s=sign(f(ab))~=sign(y);

            ab=m*(~s)+ab.*s;

            m=sum(ab)/2;

            y=f(m);

        end

        disp(['x=',num2str(m)])