2017-03-22 2 views
1

im travaillant sur octave pas sûr si elle s'exécuterait dans matlab, im essayant de faire un polynôme lagrange simple qui tracer les points, la fonction et l'aproximation lagrange, donc j'ai fait ce qui suit,arguments non conformes lagrange polynomial (octave)

clear all 
clc 

function [y] = lagrange(x, x0, y0) 

    n = size(x0,1); 
    y = 0; 

    for i=1:n 
     p = 1; 
     for j=1:n 

      if j == i % avoiding division by 0 
       continue; 
      endif; 

      p *= (x-x0(j))/(x0(i)-x0(j)); 

     endfor; 

     y += y0(i) * p; 
    endfor; 
endfunction; 

x=[0:0.1:5]; 

x0=[2;2.75;4]; 
y0=[1/2;1/2.75;1/4]; 

y=lagrange(x,x0,y0); 

Je vais avoir le problème suivant, « opérateur *: arguments nonconformant (OP1 est 1x41, op2 est 1x41) » qui apparaît uniquement lorsque vous utilisez un vecteur x, si je tente et d'évaluer par exemple lagrange (3 , x0, y0) dans un point précis, la fonction fonctionne correctement et il n'y a pas de problème, le problème est lorsque vous utilisez un plus grand vecteur pour x,

S o ma question est, est-il un moyen que je peux modifier la fonction afin qu'il fonctionne avec un plus grand vecteur x, ou il y a un moyen que je peux tracer la fonction sans utiliser le plus grand vecteur directement dans la fonction?

+0

il serait utile si vous pouviez nous dire sur quelle ligne l'erreur se produit sur. Je crois que le message d'erreur devrait vous le dire. je suppose que cela se produit à la ligne 'p * ='. pour que l'argument non conforme ait un problème avec deux choses ayant la même taille, il faudrait qu'il y ait une multiplication de matrice, qui veut m par n x n par p. –

+0

oh, oui je suis désolé pour cela, et oui, l'erreur était dans la ligne 'p * =' – Zigisfredo

Répondre

1

La ligne

p *= (x-x0(j))/(x0(i)-x0(j)); 

signifie

p = p * (x-x0(j))/(x0(i)-x0(j)); 

Ce * signifie multiplication de matrice, et on ne peut pas multiplier deux matrices (1, 41) et (1, 41): dimensions intérieures font ne correspond pas.

Qu'est-ce que vous avez besoin il y a multiplication par éléments,

p = p .* (x-x0(j))/(x0(i)-x0(j)); 

(Voir docs pour une explication de la différence).

Il pourrait être écrit comme

p .*= (x-x0(j))/(x0(i)-x0(j)); 

Mais je suggère d'éviter cette contraction; dans Matlab/Octave, il n'est pas utilisé autant que dans d'autres langages, peut-être parce que le fait de placer deux opérandes côte à côte rend les erreurs dans le choix des opérations binaires plus apparentes.

+0

Je vois, merci pour votre réponse, aide vraiment. – Zigisfredo

+0

Intéressant. Autant que je sache, les opérateurs d'assignation élément par élément sont non documentés en octave. Au moins, je ne l'ai pas vu sur la page de manuel de l'opérateur, mais un test rapide montre que cela fonctionne comme vous l'avez décrit. Et je suis assez certain que Matlab ne supporte pas du tout ces opérateurs d'arithmétique/affectation. –