Octainne Posted May 22, 2008 at 10:59 AM Report Share #186649 Posted May 22, 2008 at 10:59 AM Boas, De momento ando a fazer um projecto o qual requer a utilização do programa MatLab. O meu grande problema é derivar a variável de entrada func, que é enviada como uma function handle (@), declarada de forma anónima. handle = @(x) x^2 Junto envio o código da função até agora desenvolvido: function raiz = newton(func,a,b,ref,tipo) %Metodo de Newton para a funcao f(x) = 0 % % raiz = newton(func,a,b,ref,tipo) % %INPUT: % - func = funcao f(x), deverá ser inserida na forma "@(variavel) funcao". % - a,b = limites do intervalo I=[a,b] onde a raiz esta contida % - ref = numero de iteracoes ou tolerancia pretendida % - tipo = - 'iter' -> se fornecer o numero de iteracoes a efectuar % - 'tole' -> se fornecer a tolerancia a alcancar % %OUTPUT: % - raiz = valor aproximado da raiz obtido a partir da referencia enviada % if nargin ~= 5 error('Argumentos em falta ou em excesso! Consulte o comando help newton .') else if (~isreal(a) || ~isreal(b) || ~isreal(ref) || ~ischar(tipo)) error('Argumentos mal inseridos! Consulte o comando help newton .') else if strcmp(tipo,'iter') disp('Calculo atraves do numero de iteracoes') %Calculo do x0 xp=(a+b)/2; %Calculo da 1ª e 2ª derivada da funcao [b]syms x; dfunct=diff(func(x),x); ddfunct=diff(func(x),x,2); dfunc = @(x) dfunct; ddfunc =@(x) ddfunct;[/b] for i=0:ref xs=xp-(feval(func,xp)/feval(dfunc,xp)); erro=abs(xs-xp); erros=(feval(ddfunc,xp)*erro^2)/(2*feval(dfunc,xp)); printf('Ite:%d -> Z:%f -> Erro:%f ->Erro Seguinte:%f',i,xs,erro,erros); xp=xs; end error('Escreva no 5º argumento: iter-> se fornecer o numerod e iteracoes; tole-> se fornecer a tolerancia a alcancar.') end end end return; Desde já um obrigado. Octainne Link to comment Share on other sites More sharing options...
pedrosorio Posted May 22, 2008 at 11:34 AM Report Share #186655 Posted May 22, 2008 at 11:34 AM O polyder permite-te diferenciar polinómios, mas têm que ser polinómios sob a forma de arrays em que cada elemento representa um coeficiente... Não sei como converter function handles em arrays, e provavelmente precisas de derivar funções que não sejam polinómios. Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Octainne Posted May 22, 2008 at 11:43 AM Author Report Share #186656 Posted May 22, 2008 at 11:43 AM Eu já sou capaz de derivar a função, só que a sua derivada não e uma function handle, e o que se vão passar é o seguinte: >> syms x >> func1 = x^2 func1 = x^2 >> func=@(x) func1 func = @(x)func1 >> func(3) ans = x^2 E o que eu pretendo é: >> func=@(x) x^2 func = @(x)x^2 >> func(3) ans = 9 Link to comment Share on other sites More sharing options...
pedrosorio Posted May 22, 2008 at 11:56 AM Report Share #186658 Posted May 22, 2008 at 11:56 AM Porque é que escreveste func = @(x) func e não func = @(x) func1 ? Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Octainne Posted May 22, 2008 at 12:10 PM Author Report Share #186664 Posted May 22, 2008 at 12:10 PM sim, era isso que queria dizer, enganei-me a passar para o fórum. já alterei a resposta. Link to comment Share on other sites More sharing options...
pedrotuga Posted May 22, 2008 at 12:44 PM Report Share #186668 Posted May 22, 2008 at 12:44 PM O matlab não é um programa de cálculo algébrico, é um interpretador de funções matemáticas. como tal não é possível aplicar uma operação algébrica a uma função arbitrária. A forma de derivar uma função é numéricamente recorrendo à definição. Se quiseres definir a derivada de uma função, cria uma outra função que chame a primeira, pega no array resultante, calcula a Taxa de Variação média entre cada dois pontos consecutivos, e devolve esse array. Tão simples quanto isso. Link to comment Share on other sites More sharing options...
pedrosorio Posted May 22, 2008 at 01:28 PM Report Share #186679 Posted May 22, 2008 at 01:28 PM Se quiseres derivar à bruta simbolicamente usa o Mathematica 😛 Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Warrior Posted May 22, 2008 at 02:34 PM Report Share #186711 Posted May 22, 2008 at 02:34 PM Maxima.. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now