2015-03-09 7 views
0

Я пытаюсь написать модифицированную формулу Ньютона в MATLAB, но MATLAB показывает результаты в символьной форме (x), а не в цифрах. Вот код:Matlab показывает результат формы x

clc 
format long g 
syms x; 
fun = input ('Enter the function f(x)= : ','s'); 
f=inline(fun); 
z=diff(f(x)); 
f1=inline(z); 
z1=diff(f1(x)); 
f2=inline(z1); 
u1=f(x)/f1(x); 
u2=1-[(f(x)*f2(x))/(f1(x)^2)]; 
x0=input('enter the first guess x0=: '); 
for i=0:6 
    xn=x 
    x=xn-[u1/u2]; 
    if x==xn 
     break 
    end 
end 

И вот результаты:

Enter the function f(x)= : x^2-2 
enter the first guess x0=: 1 

xn = 
x 

xn = 
x + (x^2 - 2)/(2*x*((2*x^2 - 4)/(4*x^2) - 1)) 

xn = 
x + (x^2 - 2)/(x*((2*x^2 - 4)/(4*x^2) - 1)) 

xn = 
x + (3*(x^2 - 2))/(2*x*((2*x^2 - 4)/(4*x^2) - 1)) 

xn = 
x + (2*(x^2 - 2))/(x*((2*x^2 - 4)/(4*x^2) - 1)) 

xn = 
x + (5*(x^2 - 2))/(2*x*((2*x^2 - 4)/(4*x^2) - 1)) 

xn = 
x + (3*(x^2 - 2))/(x*((2*x^2 - 4)/(4*x^2) - 1)) 

как я могу это исправить? Спасибо.

+0

Было бы лучше сделать правку в вашей прежней должности и быть активными отвечая на вопросы народов, публикуя новую копию в надежде на лучшее. Причина, по которой вы не получили ответа, заключалась в том, что встроенное решение устарело и сложно. Кроме того, встроенные функции должны оцениваться численно. Это означает, что для чистых символических функций возникают проблемы. Я хотел попытаться удалить встроенные строки и проверить, чтобы они стали символическими, но так как вы не спрашивали, как или как-то реагировать, вам это сложно научить. SO не является бесплатной домашней работой для вас. Однако я отвечу. – patrik

+0

Дорогой patrik, я отредактировал мой бывший пост, но вчера не видел вашего комментария. я только что видел его. я стараюсь делать то, что вы говорите. но я не могу получить решение таким образом. Я подхожу к решению этого кода. но это либо не корреспондент. Я знаю это. но это лучше всего я могу сделать. –

ответ

1

Это ряд, который вызывает проблемы. Если вы собираетесь использовать что-то подобное, вы должны использовать анонимные функции, поскольку встроенные функции устарели и должны быть удалены. Однако, когда вы идете символически, это полностью избыточно. Это только вызовет больше проблем для вас, поэтому я настоятельно рекомендую вам избавиться от встроенных линий. Обычно eval не рекомендуется, но для этого приложения он должен быть в порядке. Я предполагаю, что есть другие способы сделать это, но я чувствую, что eval чувствует себя интуитивно понятным, когда оценивает выражения.

Далее вы должны рассмотреть подход при использовании вызова функции вместо ввода. function xout = newton(symbolicExpression, initialGuess). Это более динамично.

Следующий код должен делать то, что вы спросите:

clc 
format long g 
syms x; 
fun = input ('Enter the function f(x)= : ','s'); 
f = eval(fun); 
f1 = diff(f); 
f2 = diff(f1); 
u1 = f/f1; 
u2 = 1-((f*f2)/(f1^2)); 
x=input('enter the first guess x0=: '); 
for i=0:6 
    xn=x 
    x=xn-eval(u1/u2); 
    if (x-xn)<0.01 
     break 
    end 
end 
+0

это работает. Спасибо. мой английский не так хорош. поэтому я не могу понять, что вы говорите вообще. но я reall'ы пытаюсь делать то, что вы говорите. –

1

Ответ символичен, потому что x (и по расширению xn) определяется как символическая переменная. Для того, чтобы иметь численные результаты вместо этого использовать subs:

for i=0:6 
    xn=x; 
    subs(xn) % display numerical value in the command window 
    x=xn-[u1/u2]; 
    if abs(subs(x)-subs(xn))<=1e-6 % replace equality test by comparing difference to a small threshold value 
     break 
    end 
end 

Примечание: вы не должны делать проверку равенства с числами с плавающей точкой, вместо этого вы должны сравнить разницу небольшого порогового значения (см мой модифицированный код).

+0

Вы успешно пробовали это? Возможно, я сделал это неправильно, но мне не удалось получить ожидаемый численный результат. Также я получил сбой в тесте if. – patrik

+0

@patrik Нет, не знаю. Однако символические переменные отображаются правильно, поэтому нет причин, по которым использование 'subs' не должно работать. Я не знаю, какую версию использует OP, но вполне возможно, что в более старой версии использование 'inline' отлично. – am304

+0

Я вижу, но он не работал на 2014b. Может быть, так как 'x' перезаписывается. Кажется, это странно, и 'x', кажется, и догадка, и переменная. Я думаю, проблема заключается в том, что x становится выражением вместо «константы» в 'x = xn- [u1/u2];'. Это вызывает проблемы, поскольку 'x' также является зависимой переменной. Однако я написал ответ, не используя 'inline', так как Matlab утверждает, что он устарел, а затем удален. – patrik