2016-09-20 1 views
1

В настоящее время я работаю над домашним заданием, которое просит меня оценить значение с использованием метода ложной позиции. Я чувствую, что у меня почти все есть, но меня подвешивают на моем заявлении if. Поэтому я должен определить положительный реальный корень функции: ln (x^2) = 0,7, используя метод ложных постов с 3 итерациями, xl = 0,5 и xu = 2. Я приложил правильные ответы внизу, чтобы помочь мне лучше объяснить мои вопросы. У меня есть три конкретных вопроса, в которых мне нужна помощь.Matlab False-Position Method

1). Во-первых, в третьей итерации для значения Xl мой код по-прежнему рассматривает его как 1.625 вместо правильного 1.25. Я не понимаю, почему он делает это, поскольку это должно быть предотвращено. Он правильно меняет это значение на второй итерации, а не на третье.

2). Мне также нужна помощь в поиске ошибки. Эта часть я довольно застрял. Я знаю уравнение, чтобы найти ошибку, но мой вопрос заключается в том, как отслеживать, что такое xr_new и xr_old. Я не уверен, хочу ли я добавить somecind сравнения, чтобы увидеть, изменилось ли оно до вычисления или чего.

3). Я также хотел бы вывести мою ценность и построить таблицу, как и предоставленное решение. Мой предыдущий опыт работы с таблицей жестко кодирует значения непосредственно в ней, и мне сложно создавать таблицу, когда значения найдены. Я знаю, что мне нужна таблица в цикле for, и я создаю ее по одной ячейке за раз, но просто не имею опыта в этом поле, чтобы начать.

Надеюсь, это не слишком помогает попросить, чтобы у меня были передовые навыки работы с матала, и это один из самых сложных вопросов, которые мне пришлось выполнить. Любая помощь вообще очень ценится.

clc; clear; 
f= @(x) log(x.^2) - 0.7; 
x = -3: .005 : 3; 
figure(1) 
grid on 
hold on 
plot (x,f(x)) 

% bisection method with 3 iterations 
xl = 0.5 
xu = 2 

%Table = table(iteration, xl , f(xl), xu, f(xu), xr, f(xr), Ea) 

for i = 1:1:3 

    F_xl = f(xl) 
    F_xu = f(xu) 
    xr = .5*(xl+xu) 
    F_xr = f(xr) 

    if ((F_xu*F_xl) < 0) 
     xl = xr 

    else 
     xu = xr 
    end 


    %Error = abs(xr_new-xr_old)/xr_new 
end 

The correct soluton displayed in a table below:

ответ

0

Следующий код дает желаемый результат, а не предшествует код до plot()

  1. Состояние if неудавшейся, как вы использовали F_xl вместо F_xr. if ((F_xu*F_xr) < 0) дает желаемый результат.
  2. Мы можем использовать вектор для xr для хранения значений xr на каждой итерации и использовать выражение abs(xr_new-xr_old)/xr_new), чтобы найти ошибку. Я просто оставил первое значение ошибки равным нулю.
  3. Поскольку мы векторы, table() можно использовать вне цикла, чтобы получить требуемый выход

Код:

iterations = (1:3)'; 
xl = zeros(3,1); 
xu = zeros(3,1); 
xr = zeros(3,1); 
F_xl = zeros(3,1); 
F_xu = zeros(3,1); 
F_xr = zeros(3,1); 
Error = zeros(3,1); 
% bisection method with 3 iterations 
xl(1) = 0.5; 
xu(1) = 2; 
for i = 1:3 
    F_xl(i) = f(xl(i)); 
    F_xu(i) = f(xu(i)); 
    xr(i) = .5*(xl(i)+xu(i)); 
    F_xr(i) = f(xr(i)); 
    if(i<3) 
     if ((F_xu(i)*F_xr(i)) < 0) 
      xl(i+1) = xr(i); 
      xu(i+1) = xu(i); 
     else 
      xu(i+1) = xr(i); 
      xl(i+1) = xl(i); 
     end 
    end 
    if(i>1) 
     Error(i) = abs(xr(i)-xr(i-1))*100/xr(i); 
    end 
end 
T = table(iterations,xl,F_xl,xu,F_xu,xr,F_xr,Error); 
+0

Я понятия не имею, почему итерации линия = (1: 3) '; не входит в код. Добавьте эту строку при попытке этого кода. – nahomyaja

+0

Большое вам спасибо! Я должен был подумать, чтобы начать xl, xu и xr в виде трех пустых пространств. – jake

+0

Добро пожаловать. Надеюсь, вы поняли, что делается в коде. Я не много объяснял, так как вы сказали, что являетесь опытным программистом MATLAB. – nahomyaja