کلیدستان

نسخه‌ی کامل: لطفا تو نوشتن این تابع کمکم کنین
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
تابعی بنویسید که یک ماتریس مقادیر معلوم , ماتریس ضرایب را دریافت نموده و پس از بررسی همه شرایط سازگاری AX=B این دستگاه معادلات را با استفاده از روش حذفی گاوس حل نماید.
ممنون میشم کمکم کنین
 
این لینک ها رو نگاه کن شاید به دردت بخوره:
http://www.adadi.ir/6661560-%D8%B1%D9%88...imination/

http://www.matlabsite.com/tag/%D8%B1%D9%...9%88%D8%B3


این لینک زیر شامل فایل ورد است که از طریق چند روش معادله بالا رو حل کرده ، لینک رو که کلیک کردی یک فایل ورد رو دانلود میکنی :

https://www.google.com/url?sa=t&rct=j&q=...3115,d.Yms
مرسی از توضیحاتتون

 
من فایل وورد رو مطالعه کردم
و بخشی که به مورد نیاز من بود روش گاوس هستش

کد:
function X=GE(A,B)
tic
[r,c]=size(A);
for i=1:r-1
    for j=i+1:r
        lambda=A(j,i)/A(i,i);
        A(j,:)=A(j,:)-lambda*A(i,:);
        B(j)=B(j)-lambda*B(i);
    end
end
X=zeros(r,1);
X(r)=B(end)/A(end,end);
for i=r-1:-1:1
    A(i,i+1:end)
    X(i+1:end)
    X(i)=(B(i)-(A(i,i+1:end)*X(i+1:end)))/A(i,i);
end
toc
end

اگه لطف کنین کدهایی که تو این قسمت هست رو یه توضیح بدین و بگین که کاره هر یک از کدها چی هستش  ممنون میشم
سلام.
در همان فایل، فرمول ها ذکر نشده بود ؟
کدها چیز خاصی ندارن، فقط اجرای یک سری فرمول (یک روند مشخص) هستند. tic و toc برای تعیین زمان پردازش به کار می رود. کل کدها هم به صورت تابع ( function )نوشته شده، بنابراین باید کدها رو در یک m-file کپی کرده و سپس با نام GE ذخیره کنید. دستور zeros برای ساخت یک ماتریس است که تمام عناصر آن برابر صفر باشد. دستور size هم برای تعیین اندازه ماتریس ها به کار میره.
همچنین کلمه end ، نمایش دهنده آخرین عنصر در یکی از ابعاد ماترس است. مثلا این کد را ببینید :

کد:
A(2,4:end)

برای شماره ستون، عبارت زیر نوشته شده :

کد:
4:end

که معنی آن این است که ستون های از شماره 4 تا آخرین ستون. بنابراین کد قبل، به همه عناصری از A اشاره می کند که در ردیف شماره 2 قرار گرفته اند و شماره ستون آنها، از 4 تا آخرین ستون می باشد.
سلام نه خیر هیچ فرمولی تو فایل وررد ذکر نشده بود.
توضیحاتی هم که راجع به کد های تابع دادین خیلی اجمالی و سریع بود
اگه لطف کنین کمی بیشتر و با جزییات کدها رو توضیح بدین و کاربرد هرکدوم رو بهم بگین ممنون میشم.
این کدها هیچ چیز خاصی برای توضیح دادن نداره. بهتره به دنبال روش باشید و ببینید روش چی بوده، وگرنه کدنویسی آن، به جز مواردی که گفتم، یک سری ارجاع به ردیف ها و ستون های بردارها و جمع و ضرب هست. شما مثلا اگر نمی دونید دستور zero چطور عمل میکنه، به مباحث سایت در رابطه با این دستور مراجعه کنید و سایر دستورات نیز همین طور. در سایت، یک راهنما برای دستورات متلب، بر اساس حرف اول آنها، وجود دارد. مباحث مربوط به این دستورات را با این راهنما، پیدا کرده و بخوانید.
ما تمامی مباحث را نوشتیم، تا نیاز به تکرار آنها نباشد.
در اینترنت، ((روش حذفی گاوس)) را جستجو کنید و سپس ببینید که چگونه عمل می کند. آنگاه متوجه خواهید شد که هر خط از کدها، به چه منظوری نوشته شده است.
مرسی admin دستت درد نکنه ممنون
خیلی راهنمایی کردین ممنون
دوست عزیز معنی کدهای تیک و تاک چی هستش؟؟
من میخوام یه تابعی بنویسم که تیک و تاک توش بکار نرفته باشه
(۱۳۹۲/۰۸/۰۸, ۱۱:۰۱ ب.ظ)'cloner' نوشته: [ -> ]دوست عزیز معنی کدهای تیک و تاک چی هستش؟؟
من میخوام یه تابعی بنویسم که تیک و تاک توش بکار نرفته باشه

 

برای تعیین مقدار زمان اجرای دستورات می باشد، در مبحث زیر شرح داده شده :

http://www.kelidestan.com/matlab/matlab-19.php

برای حذفشون، دو کلمه tic و toc را از برنامه حذف کنید.
متوجه شدم که تیک و تاک چه کاربردی دارند
اما اگه دستورات تیک و تاک رو از تابع حذف کنیم مشکلی پیش نمیاد؟
در ضمن دستور lambda رو نتونستم تو سایت پیدا کنم که مفهومش چیه؟


 
خیر، اگر حذف بشن مشکلی پیش نمیاد.
lambda یک متغیر هست که در کدها تعریف شده، نه یک دستور. شما باید به سراغ اصول اولیه برنامه نویسی متلب بروید و همه آنها را بخوانید.
 
(۱۳۹۲/۰۸/۰۹, ۰۴:۵۱ ب.ظ)'admin' نوشته: [ -> ] 

ادمین همون طور که گفتی تیک و تاک رو از تابع حذف کردم و برنامه هیچ اروری نداد
فقط میشه بگین که چطور میتونم این تابع رو تست کنم
بعنوان مثال چطور میشه این معادله رو به تابع بدم تا برام حل کنه
A=[1,-2,3;-1,2,-2;2,-2,3]
B=[-2;3;-7]
 
کد:
X=GE([1,-2,3;-1,2,-2;2,-2,3],[-2;3;7])

 

 
نقل قول: 
مهندس من این کدی که دادی رو زذم و این پیغامو نمایش داد
Error using GE (line 5)
Not enough input arguments.
 
که در لاین 5 فقط اندازه ماتریسو تعریف کرده چیزه خاصی نداره
اگه بگید مشکل چیه ممنون میشم


 
اینطور که تو کدها میبینم شاید باید ماتریس های A و B مربعی باشند ، توضیحات کدی که پیدا کردی رو خوب بخون و روش محاسبه رو به صورت تئوری مطالعه کن. برای درک یک کد باید مثالی که خودت نوشتی همون ماتریس های A و B که تعریف کردی رو خودت برای هر خط کد بنویسی ، منظور اینه که خودت باید دستی خروجی هر خط رو بنویسی و بعد میفهمی مشکل چیه مثلا خط اول کد سایز ماتریس A رو در دو متغیر r و c ذخیره میکنه ، این متغیرها رو خودت دستی بنویس و بعد خط بعد ، به این ترتیب به جای متغیرهای در کدهایی که نوشتی عددهایی که از خط قبلی کد به دست آوردی بنویس و بیا پایین ، اینطوری مشکل رو پیدا میکنی. البته میدونم که اصلا این کارهایی رو که مینویسم انجام نمیدی ! ولی نوشتم که نوشته باشم.
(۱۳۹۲/۰۸/۱۵, ۰۱:۰۲ ب.ظ)'4i469x' نوشته: [ -> ] 
دوست عزیز متلب ارور میده که تابع ورودی یا ارگومان بیش از حد مجاز میباشد
برعکس حالت قبل
در ضمن میخوام که حساب کنم بصورت دستی یه مشکل کوچیک هست اونم اینه که نمیدونم i و j که تو چند خط اول هست نشانگر چی هستش
کد پی‌اچ‌پی:
[r,c]=size(A);
for 
i=1:r-1
    
for j=i+1:
اگر شما مفهوم این کد رو بهم بگین ممنون میشم بعد خودم بصورت دستی حساب میکنم
 
cloner ، همونطور که گفتم شما اصلا مطالعه نمیکنی ، i و j برای دستور for است یعنی تعداد تکرار حلقه رو میگه . توضیحات دستور for  رو از کلیدستان بخون. وقتی تو خط اول i یک مقداری گرفته میشه در دستور for رد خط بعد مقدار j از 1+i که در حافظه ذخیره شده محاسبه میشه تا مقدار r که مقدار اولین داده ماتریس size است.

 
نقل قول:  
مهندس مثل پست قبلی به مشکل برخوردم نمیدونم که این کد رو چطوری تو فانکشن قرار بدم
((کلا این قسمت کد نویسی خیلی مشکله نمیشه تشخیص داد چطور نوشت))
کد پی‌اچ‌پی:
function[X]=GE(A)
%
UNTITLED Summary of this function goes here
%   Detailed explanation goes here
[r,c]=size(A);
for 
i=1:r-1
    
for j=i+1:r
        lambda
=A(j,i)/A(i,i);
        
A(j,:)=A(j,:)-lambda*A(i,:);
        
B(j)=B(j)-lambda*B(i);
    
end
end
 
X
=zeros(r,1);
X(r)=B(end)/A(end,end);
 
for 
i=r-1:-1:1
    A
(i,i+1:end)
    
X(i+1:end)
X(i)=(B(i)-(A(i,i+1:end)*X(i+1:end)))/A(i,i);
end

end 
درسته؟؟؟/


 
ابتدا باید تذکر بدهم که بهتر است نام دیگری برای تابع انتخاب کنید، چون خود نرم افزار متلب، تابعی با نام ge دارد (می دانم حروف GE بزرگ است، ولی اگر خود کلمه فرق داشته باشد، بهتر است).
کدها غلط است، زیرا متغیر B اصلا تعریف نشده و خطای زیر را ایجاد می کند :

کد:
??? Undefined function or variable "B".

Error in ==> GE at 9
        B(j)=B(j)-lambda*B(i);

شما باید B را هم به عنوان ورودی برای تابع، تعریف کنید.
ادمین والا خیلی پیچیده هستش
اگه خودت تو فانکشن بزاری ممنون میشم


 
 اصلا پیچیده نیست. شما تنها باید در خط اول تعریف تابع، در کنار نماد A ، نماد B را هم بگذارید (با یک علامت , در بین آنها). خودتان می توانید (هدف یادگیری شما است).
(۱۳۹۲/۰۸/۲۷, ۱۱:۴۴ ق.ظ)'admin' نوشته: [ -> ] اصلا پیچیده نیست. شما تنها باید در خط اول تعریف تابع، در کنار نماد A ، نماد B را هم بگذارید (با یک علامت , در بین آنها). خودتان می توانید (هدف یادگیری شما است).

 

ادمین درسته؟

کد پی‌اچ‌پی:
function[X]=GE(A,B)
%
UNTITLED Summary of this function goes here
%   Detailed explanation goes here
[r,c]=size(A,B);
for 
i=1:r-1
    
for j=i+1:r
        lambda
=A(j,i)/A(i,i);
        
A(j,:)=A(j,:)-lambda*A(i,:);
        
B(j)=B(j)-lambda*B(i);
    
end
end
 
X
=zeros(r,1);
X(r)=B(end)/A(end,end);
 
for 
i=r-1:-1:1
    A
(i,i+1:end)
    
X(i+1:end)
X(i)=(B(i)-(A(i,i+1:end)*X(i+1:end)))/A(i,i);
end

end 

 
شما فقط باید در خط اول برنامه، قرار می دادین. مثلا کد زیر غلطه :

کد:
[r,c]=size(A,B);

در کل فکر می کنم که این طوری برنامه نویسی متلب یاد نمیگیرین. شما خیلی راحت میتونستین برنامه رو اجرا کنید و ببینید که خطا میده. اما به جای این کار، کدها رو در اینجا copy و paste می کنید تا من خطایابی کنم. دیگر پاسختان را نمی دهم، زیرا باید اراده ای برای یادگیری در سوال کننده باشد. 
ادمین اتفاقا خیلی مشتاقم که برنامه نویسی با متلب رو یاد بگیرم
دلیل اینکه کدها رو کپی پست کردم این بود که اون زمان پشت کامپیوتر خودم نبودم و برنامه متلب رو سیستم دوستم نصب نبود
با این حال جوابه درست کدها رو بهتون میفرستم تا ببینید که الکی وقتمو تلف نمیکنم
عالیه ! چون هدف از راه اندازی سایت کلیدستان هم همینه . قوی تر شدن برنامه نویسی من و سایر کاربران سایت، اولین اولویت است. به نظر من، انجام پروژه در اولویت دوم می باشد (وقتی از دانشگاه فارغ التحصیل شوید و همه استرس های آنجا را فراموش کنید، کاملا متوجه منظورم می شوید). عجله نکنید و اگر می توانید بخشی از کدها را خودتان بنویسید، هرگز به سراغ دیگران نروید. اگر سوالی باشد که ببینم قبلش به دنبال پاسخ بوده اید اما به نتیجه نرسیده اید، پاسخ می دهم. 

شما سماجت زیادی در این زمینه دارید، اگر خوب به راهنمایی ها گوش یدهید، حتما یک برنامه نویس موفق می شوید. 
 

 
 
کد پی‌اچ‌پی:
function X=hazf(A,B)
[
r,c]=size(A);
for 
i=1:r-1
    
for j=i+1:r
        lambda
=A(j,i)/A(i,i);
        
A(j,:)=A(j,:)-lambda*A(i,:);
        
B(j)=B(j)-lambda*B(i);
    
end
end
 
X
=zeros(r,1);
X(r)=B(end)/A(end,end);
 
for 
i=r-1:-1:1
    A
(i,i+1:end)
    
X(i+1:end)
X(i)=(B(i)-(A(i,i+1:end)*X(i+1:end)))/A(i,i);
end
end 

این دستور رو تایپ میکنم

کد پی‌اچ‌پی:
>> X=hazf([2 4 --2;1 2 4 -3;--3 8 -2; -1 1 6 -3],[-4;5;7;7]) 

این جوابو میده

کد پی‌اچ‌پی:
ans =

   
Inf


ans 
=

   
NaN


ans 
=

     
5    -2


ans 
=

   
NaN
   NaN


ans 
=

     
4    -2    -2


ans 
=

   
NaN
   NaN
   NaN


=

   
NaN
   NaN
   NaN
   NaN 

درحالی که هیچ ارروری نمیده و لی جوابم نمیده
 
ادمین چرا نظرتو نمیده
من که کدهارو قرار دادم
من معمولا برای خطا در کدنویسی راهنمایی می کنم، ولی کد شما خطا نمی دهد و باید الگوریتم را چک کنید. مقدار NaN در اثر ایجاد ابهام و یا خیلی بزرگ یا کوچک بودن اعداد، تولید می شود. مثلا برای ابهام صفر تقسیم بر صفر و ...
بنابراین باید ببینید کدام قسمت الگوریتم شما باعث به وجود آمدن NaN ها می شود.
در ضمن ببینید که الگوریتم برای چه نوع ورودی هایی طراحی شده است.
 
ادمین گفته های شما تا حدودی درسته
پس از بررسی کدها متوجه شدم که این برنامه فقط قادره ماتریس هایی رو حل کنه که نیاز به محور گیری نداشته باشه
اگر ماتریسی بدیم که با محورگیری حل بشه مثل ماتریس بالا درست حل نمیکنه و یه جایی از کدها رو تقسیم بر صفر میکنه و NAN رو نمایش میده