Matlab işlem sorunu.

Başlatan NaMcHo, 11 Mart 2011, 00:31:13

NaMcHo

clear all,clc;
syms x;
y=1;
f=0;
derece=input('Fonksiyon derecesini giriniz : ');
%0.Terim x^0 katsayıli olan terim
for i=0:derece
    disp(y);
    y=y+1;
    katsayi=input('. Terimin Katsayısını Giriniz : ');
    f=f+katsayi*x^i;
end
t=input('Tolerans degeri giriniz : ');
s1=input('Ilk sınır degerini giriniz : ');
s2=input('Ikinci sınır degerini giriniz :');
N=round(log10((s2-s1)/t)/log10(2));                     %Yapilmasi gereken Literasyon Sayisi
x=1;
disp(f);


Aldığım Çıktı :
Fonksiyon derecesini giriniz : 2
     1

. Terimin Katsayısını Giriniz : 3
     2

. Terimin Katsayısını Giriniz : 2
     3

. Terimin Katsayısını Giriniz : 1
Tolerans degeri giriniz : 10^-2
Ilk sınır degerini giriniz : 1
Ikinci sınır degerini giriniz :2
x^2 + 2*x + 3
 
>>

x=1 için sonucun 6 cıkması gerekirken ekranda hicbirsey yazmıyor.

ferdem

disp(f) yerine sadece f veya fprintf('Sonuc= %f',f) yazıp deneyebilirsiniz. Kolay gelsin.

NaMcHo

#2
Cevabınız icin teşekkürler.
x=2
f

seklinde yazdım ve cıkısta sadece denklemi gordum.
x=2
fprintf('Sonuc = %f',f)
ilede
??? Error using ==> fprintf
Function is not defined for 'sym' inputs.

bu hatayı aldım.
ben x i smys x seklinde tanımladım fprintf bunları göstermiyormus. x i eger tanımlamassam sembol seklinde bu seferde
for i=0:derece
    disp(sayac);
    sayac=sayac+1;
    katsayi=input('. Terimin Katsayısını Giriniz : ');
    f=f+katsayi*x.^i;
end

Şu kısımda katsayi değerlini girerken x tanımlanmamıstır hatasını veriyor.

-Düzeltme Cok tuhaf birşey oldu %syms x;'i şeklinde kapattım programda calıstırdım, program calıstı daha sonra üste clear all,clc; komutunu yazdım her programı calıstırdıgımda temizlensin ekran diye tekrar programı calıstırdım x tanımlanmamıstır hatasını verdi(ilk katsayi degerini girerken) benim matlab damı sorun var aceba? matlab7.9.0(200b) kullanıyorum.Daha sonra tekrar syms x; yazıp tekrar verdim katsayı degerlerini fprintf  fonksiyonu smys degerlerini
yazamıyor hatasını aldım yine,tekrar %syms x; ile bu kısmı kapattım yine calıstırdım ve yine calıstı programım clear all,clc; komutunu eklemedim,bu komutları ekleyince neden calısmıyor program?
Birde birkaç değer veriyim dedim x'e.Denklemimi x^2+2*x+3 seklinde yazdım hep.
x=4
fprintf('Sonuc = %10.02f',f);

x=4 icin sonucu 18 buldu(x=3 icin sonuc 18 cıkıyor) , x=0 icin sonucu 27 buldu(yani x'e 4 degerini verince bulcağı degeri 0 verince buldu) , x=4  yazdım birde bu seferde sonucu 3 buldu yani x'e 0 verince bulcağım sonucu verdi, bir adımlık gecikme var nedense sonra m-file icinde değilde normal matlab ekranında clear komutunu yazdım yine ilk katsayı değerini girerken x tanımlanmamıstır hatasını verdi.

Düzeltme2:Programımı yazdım çalışıyor ufak birkaç fonksiyon daha yazıyorum dahada kullanışlı olması için ödevimin ,akşama veya yarın birkaç sorumla birlikte paylaşacağım çalışmamı.

NaMcHo

Konunun başında yazıpda çalıştıramadığım program(Bu haliyle çalışıyor)
%f[] matrisi icine katsayılar girilerek istenen fonksiyon olusturulur.
clear all,clc;
f=[1 0 -1 -1];
t=input('Tolerans degerini giriniz : ');
%[a,b] araliği belirleniyor.
a=input('Sol sinir degerini giriniz : ');
b=input('Sag sinir degerini giriniz :');
N=round(log10((b-a)/t)/log10(2));                %%Literasyon sayisi hesaplaniyor.round() yuvarlama işlemini yapar.
j=a;
i=b;
x=a;
y=b;
for i=0:N
s1=polyval(f,a);                    %%Sınır değerlerinin sonuçları hesaplanıyor                  
s2=polyval(f,b);                    %%y eksenindeki karşılıkları.
    if s1*s2<0                      %Eger f(a)*f(b)<0 ise bu aralıkta kök var demektir
        w=(a+b)/2;                  %Ve bu köke yaklasmak icin a,b nin ortalaması alınıyor.
    else
        disp('GIRDIGINIZ SINIRDEGERLERI ARASINDA KOK YOKTUR !');    %Eger f(a)*f(b)>0 ise [a,b] arasında  
        break;                                                      %kök yok demektir ve döngüden çıkılır break ile.
    end
    s3=polyval(f,w);      %Elde edilen yeni yaklasik kök degerinin sonucu bulunuyor ve s3 değişkenine atanıyor.
    if s1*s3<0            %Eğer f(a)*f(w)<0 ise yeni yaklasık kök değerimiz [a,w] arasindadir.         
        b=w;              %Ve eski sınır değerimiz olan b yerine yeni sınır değerimiz w olur  
    elseif s2*s3<0
        a=w;
    end
end
                    
fprintf('Literasyon sayisi : %2.0f\n',N);   %%Girmiş olduğumuz tolerans değeri sonucu elde ettiğimiz literasyon sayısı sonunda
if polyval(f,x)*polyval(f,y)<0
fprintf('Yaklaşık Kök Değeri w = %2.10f\n',w);           %%Elde ettiğimiz yaklaşık kök değeri ekrana yazdırılıyor.
fprintf('f(w)=%10.10f\n',polyval(f,w));       %%Yaklaşık kök değerinin sonucu ekrana yazdırılıyor.

x=j:0.001:i;
y=f(1,1)*(x.^3)+f(1,2)*(x.^2)+f(1,3)*x+f(1,4);                 
plot(x,y);               %%Fonksiyon grafiği çizdiriliyor.
grid;
end

Sorunu denklemimdeki katsayıları bir boyutlu matrisin içine alarak hallettim illada ax^2+bx+c gibi x lerin görünmesine gerek yok diyerekden sorunu hallettim.

Fonksiyon olusturan ve fonksiyonu ekrana yazan program
%ceil(x) x=4.5,4.3,4.8 gibi degerlerde x'i yukarı yuvarlar yani 5 olur 
%ceil(4)=4 dür

%floor(x) x=4.5,4.3,4.8 gibi değerleri floor() alta yuvarlar yani sonucları
%4 olur bu girilen x degerlerinin.
clear all,clc;
xy=input('DENKLEM KATSAYİLARİ GİRİNİZ POZİTİF OLARAK : ');
uz=log10(xy);
uz=floor(uz)+1;
f=[0];
j=uz;
for i=1:uz
    if i==1
        f(1,1)=xy/10^(uz-1);
        f(1,1)=floor(f(1,1));
    else
         j=j-1;
         f(1,i)=rem(xy,10^j);                       %Bölümünden kalanı veren fonksiyondur.
         uz=j-1;
         f(1,i)=floor(f(1,i)/10^uz);
         
    end
end
f
pnuz=floor(log10(xy))+1;
pn=[0];                                                                 %pn = pozitif negatif fonksiyonu burada girilen katsayıların işaretlerini kullanıcıdan istiyorum.
disp('Katsayisi (-) olanlara |-1| (+) olanlara |1| yazınız !');
for i=1:pnuz
    fprintf('%d.Terimin Katsayisinin işaretini yaziniz : ',i)
    pn(1,i)=input(' ');
    if pn(1,i)==1 || pn(1,i)==-1
        continue;
    else
        fprintf('\n\n')
        error('SADECE -1 , +1 DEGERLERINI GIREBILIRSINIZ\n');
        a=0;
        break;
    end
end
%Fonsiyonun katsayıları hesaplanıyor
if i==pnuz
    for j=1:pnuz
        f(1,j)=f(1,j)*pn(1,j);
    end
end
%Fonksiyon ekrana yazdırılıyor.
fprintf('f(x)=');
us=pnuz-1;
for j=1:pnuz
    if f(1,j)==0
        us=us-1;
       continue;
    else
       if us~=0
           if f(1,j)>0
               fprintf('+%d*x^%d',f(1,j),us)
               us=us-1;
           else
               fprintf('%d*x^%d',f(1,j),us);
               us=us-1;
           end
       else
           if f(1,j)>0
               fprintf('+%d',f(1,j));
           else
               fprintf('%d',f(1,j));
           end
       end
    end
end
fprintf('\n');