<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Alireza Qazavi</title>
        <link>https://virgool.io/feed/@alirezaqazavi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-18 16:48:35</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1611643/avatar/Zm6wp7.jpeg?height=120&amp;width=120</url>
            <title>Alireza Qazavi</title>
            <link>https://virgool.io/@alirezaqazavi</link>
        </image>

                    <item>
                <title>چگونه پیچیدگی محاسباتی را برای الگوریتمهای بهینه سازی محدب بدست آوریم؟</title>
                <link>https://virgool.io/@alirezaqazavi/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%DB%8C%DA%86%DB%8C%D8%AF%DA%AF%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA%DB%8C-%D8%B1%D8%A7-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85%D9%87%D8%A7%DB%8C-%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%85%D8%AD%D8%AF%D8%A8-%D8%A8%D8%AF%D8%B3%D8%AA-%D8%A2%D9%88%D8%B1%DB%8C%D9%85-pxc52jsuhjjz</link>
                <description>در ادامه پست قبلی با عنوان مقدمه ای بر محاسبه پیچیدگی محاسباتی، در این قسمت به طور خاص بر روی محاسبه پیچیدگی محاسباتی برای الگوریتمهای حاوی مسئله بهینه سازی محدب تمرکز می کنیم. با ما همراه باشید.اولین مرحله اینه که شما باید بدونید یا بتونید تخمین بزنید که الگوریتم شما در هر کدام از حلقه ها چند بار تکرار میشود تا همگرایی حاصل شود. اگه با CVX مسئله تون را حل میکنید این برنامه یک تخمینی از تعداد تکرار مورد نیاز ارائه میدهد.مرتبه تعداد تکرارهای مورد نیاز در CVX می تواند بسته به نمونه مسئله و داده های ورودی متفاوت باشد. CVX برای حل مسائل بهینه سازی محدب از یک روش نقطه داخلی (مخصوصاً از یک روش primal-dual) استفاده می کند و تعداد تکرارهای مورد نیاز این روش می تواند به عوامل مختلفی مانند اندازه مسئله، دقت مورد نیاز، تعداد شرط مسئله و نقطه امکان پذیر اولیه بستگی داشته باشد.با این حال، به طور کلی، تعداد تکرارهای مورد نیاز توسط CVX را می توان با مرتبه O(sqrt(n*log(1/epsilon))) تخمین زد، که در آن n بعد مسئله است (یعنی تعداد متغیرهای تصمیم گیری) و اپسیلون تلورانس برای optimality gap است. تعداد واقعی تکرارها بسته به نمونه مشکل خاص و داده های ورودی ممکن است بیشتر یا کمتر باشد.در قدم دوم لازم هستش که پیچیدگی محاسباتی را برای سالور مورد نیازتون در نظر بگیرید.در اینجا بدترین پیچیدگی های O بزرگ برای روش های تکراری Gradient Descent، Sedumi، SDPT3، روش نیوتن و همچنین زبان های مدل سازی CVX و YALMIP آمده است:- Gradient Descent: O((n + m) * (1 / epsilon))- Sedumi: O(n^3 * (log(n) + log(1/epsilon)))- SDPT3: O(n^3 * (log(n) + log(1/epsilon)))- Newton&#x27;s Method: O((n + m)^3)- CVX (using interior point method): O(n^3 + n^2*m + n^2*(log(1/epsilon)))- YALMIP (using interior point method): O(n^3 + n^2*m + n^2*(log(1/epsilon)))باز هم، اینها در بدترین حالت پیچیدگی های O بزرگ هستند و عملکرد واقعی یک الگوریتم ممکن است به عوامل مختلفی مانند نمونه مسئله خاص، داده های ورودی و اجرای الگوریتم بستگی داشته باشد.</description>
                <category>Alireza Qazavi</category>
                <author>Alireza Qazavi</author>
                <pubDate>Fri, 31 Mar 2023 14:14:43 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای سریع نمادگذاری Big O برای محاسبه پیچیدگی محاسباتی</title>
                <link>https://virgool.io/@alirezaqazavi/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%B3%D8%B1%DB%8C%D8%B9-%D9%86%D9%85%D8%A7%D8%AF%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-big-o-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D9%BE%DB%8C%DA%86%DB%8C%D8%AF%DA%AF%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA%DB%8C-veeq2uy4sjoh</link>
                <description>مقایسه پیچیدگی های محاسباتیپیچیدگی زمانی چیست؟پیچیدگی زمانی، اندازه گیری زمان لازم برای اجرای یک برنامه توسط کامپیوتر، به عنوان تابعی از طول ورودی است. اگرچه زمان یک فاکتور مهم هنگام نوشتن یک الگوریتم است، پیچیدگی زمانی در واقع با تعداد میلی ثانیه، ثانیه یا (خدای نکرده) دقیقه ای که طول می کشد تا برنامه کامل شود، اندازه گیری نمی شود. این به این دلیل است که مدت زمان لازم برای اجرای یک برنامه توسط رایانه اغلب به خودِ رایانه بستگی دارد. اجرای برنامه‌ای که در یک کامپیوتر 0.01 ثانیه طول می‌کشد، ممکن است در رایانه دیگر 0.08 ثانیه طول بکشد. این تفاوت، ناچیز به نظر می رسد، به خصوص با توجه به اینکه هر دو رایانه برنامه را با سرعت نسبتاً بالایی اجرا می کردند، اما این ناهماهنگی، به اندازه کافی قابل توجه است که این گونه اندازه گیری پیچیدگی (بر حسب زمان اجرا) مناسب برای سنجش کارایی یک الگوریتم نیست. به همین دلیل است که پیچیدگی زمانی با تعداد عملیات O که توسط الگوریتم، بر روی تعدادی عنصر n انجام می‌شود، اندازه‌گیری می‌شود، نه با مقدار زمانی که برای اجرا لازم است!زمان ثابت - Constant Time — O(1)زمان ثابت نشان می دهد که بدون توجه به طول ورودی، تعداد عملیات همیشه ثابت باقی می ماند.const array1 = [6, 1, 5, 5, 4, 3]
const array2 = [4, 1, 99, 7, 3, 4, 1, 20, 5, 9, 200, 90]
function findThirdElement(array){
    return array[2]
}
console.log(&#039;Third element: &#039;, findThirdElement(array1))
//=&gt; Third element: 5
console.log(&#039;Third element: &#039;, findThirdElement(array2))
//=&gt; Third element: 99       در این مثال، تابع findThirdElement()آرایه را دریافت کرده و سومین عنصر را برمی گرداند (عنصر در جیاگاه شاخص 2). پیچیدگی زمانی این تابع برابر O(1) است. زیرا تعداد عملیاتی که رخ می دهد مستقل از طول ورودی است. مهم نیست که array1 چقدر طولانی باشد، تابع همیشه عنصر سوم را پیدا کرده و برمی گرداند.پیچیدگی O(1) به دلیل استقلال آن نسبت به طول ورودی، اندازه گیری ایده آلی برای پیچیدگی زمانی است.زمان خطی-Linear Time — O(n)زمان خطی نشان می دهد که با افزایش سایز ورودی، تعداد عملیات نیز به طور متناسب با آن، افزایش می یابد.const array = [0, 1, 2, 3, 4]function hasMatch(array, num){
    for (let i = 0; i &lt; array.length; i++){
        if (array[i] === num){
            return true
        }
    }
    return false
}console.log(&#039;Has a Match?: &#039;, hasMatch(array, 3))//=&gt; Has a Match?: trueconsole.log(&#039;Has a Match?: &#039;, hasMatch(array, 5))//=&gt; Has a Match?: falseدر مثال بالا، تابعhasMatch()یک آرایه و یک عدد صحیح می گیرد و روی آرایه تکرار می شود تا مشخص کند که آیا عنصری برابر با عددِ صحیحِ داده شده در آن وجود داره یا نه. پیچیدگی زمانی این تابع O(n) است زیرا تعداد عملیات با طول آرایه ورودی نسبت مستقیم دارد. آرایه در حال حاضر دارای پنج عنصر است، بنابراین تابع باید در مجموع پنج عملیات را هنگام تکرار در آرایه انجام دهد. از آنجایی که نمی‌توانیم تضمین کنیم که طول آرایه همیشه پنج خواهد بود، متغیر n را به آن اختصاص می‌دهیم تا تعداد عناصر ممکن را نشان دهد، بنابراین نماد O(n) را خواهیم داشت. نماد O(n) یک اندازه گیری ایده آل برای پیچیدگی زمانی است زیرا تعداد عملیات با طول ورودی نسبت مستقیم دارد.زمان مربعی Quadratic Time — O(n²)زمان درجه دوم (مربعی) نشان می دهد که تعداد عملیات متناسب با مجذور طول ورودی است.const array1 = [0, 4, 1, 2, 5]
const array2 = [3, 4, 2, 7]
const array3 = [7, 6, 8, 3]
function containsDuplicate(array1, array2){
    for (let i = 0; i &lt; array1.length; i++){
        for (let j = 0; j &lt; array2.length; j++){
            if (array1[i] === arrray2[j]){
                return true
            }
        }
    }
    return false
}
console.log(&#039;Contains Duplicate?: &#039;, containsDuplicate(array1, array2))
//=&gt; Contains Duplicate?: true
console.log(&#039;Contains Duplicate?: &#039;, containsDuplicate(array1, array3))
//=&gt; Contains Duplicate?: falseدر تابع بالا، containDuplicate()، دو آرایه وارد شده و با یکدیگر مقایسه می شوند. این تابع در هر دو آرایه در یک حلقه تودرتو حلقه می زند و هر عنصر در آرایه اول را با هر عنصر در آرایه دوم مقایسه می کند تا زمانی که یک عنصر تکراری پیدا کند. پیچیدگی زمانی این تابع O(n²) است زیرا حاوی یک حلقه تو در تو است که هر حلقه به ترتیب به طول آرایه 1 و آرایه 2 بستگی دارد.نماد O(n²) یک اندازه گیری ایده آل برای پیچیدگی زمانی نیست زیرا تعداد عملیات به صورت تصاعدی با افزایش ورودی افزایش می یابد.زمان نمایی Exponential Time — O(2^n)زمان نمایی نشان می دهد که تعداد عملیات متناسب با دو با توان n است که n طول ورودی است.function fibonacci(num){
    if (num &lt;= 1){
        return num
    }else{
        return fibonacci(num - 2) + fibonacci(num - 1)
    }
}
console.log(&#039;Fibonacci: &#039;, fibonacci(4))
//=&gt; Fibonacci: 3
console.log(&#039;Fibonacci: &#039;, fibonacci(10))
//=&gt; Fibonacci: 55
console.log(&#039;Fibonacci: &#039;, fibonacci(20))
//=&gt; Fibonacci: 6765تابع fibonacci()یک عدد یا یک شاخص در دنباله فیبوناچی می گیرد و مقدار دنباله فیبوناچی را در آن شاخص محاسبه کرده و برمی گرداند. این یک تابع بازگشتی است، به این معنی که حداقل یک بار خود را فراخوانی می کند.پیچیدگی زمانی تابع O(2^n) است. این در مقیاس کوچک مشکلی ندارد اما با افزایش ورودی به سرعت از کنترل خارج می شود و برای نوشتن الگوریتم ها پیچیدگی زمانی ندارد.زمان فاکتوریل-Factorial Time — O(n!)زمان فاکتوریل نشان می دهد که تعداد عملیات متناسب با n فاکتوریل است.const array1 = [&#039;a&#039;, &#039;b&#039;, &#039;c&#039;, &#039;d&#039;, &#039;e&#039;, &#039;f&#039;]
const array2 = [&#039;dog&#039;, &#039;cat&#039;, &#039;ferret&#039;]

function possibleCombinations(array){
    let total = array.length
    for (let i = 1; i &lt; array.length; i++){
        total = (total * (array.length - i))
    }
    return total
}
console.log(&#039;The total number of possible combinations is: &#039;, possibleCombinations(array1))
//=&gt; The total number of possible combinations is: 720
console.log(&#039;The total number of possible combinations is: &#039;, possibleCombinations(array2))
//=&gt; The total number of possible combinations is: 6تابع، () possibleCombinations، یک آرایه را می گیرد و تعداد کل ترکیبات ممکن بین همه عناصر را برمی گرداند. فاکتوریل یک تابع ریاضی است که در آن عدد n در هر عدد صحیح بین 1 و n-1 ضرب می شود. مثلا 5! به صورت 5x4x3x2x1 = 120 ارزیابی می شود. همانطور که در بالا ذکر شد، تفاوت بین 3! و 6! بسیار زیاد است، به همین دلیل است که این بدترین عمل مطلق در نوشتن الگوریتم ها در نظر گرفته می شود زیرا تعداد عملیات !n افزایش می یابد. هر بار که ورودی افزایش می یابد. تقریباً هرگز موردی وجود ندارد که در آن O(n!) استفاده شود، اما دانستن هر دو روش مهم است.منبعhttps://medium.com/weekly-webtips/a-quick-guide-on-big-o-notation-time-complexity-2ada6ce6c546</description>
                <category>Alireza Qazavi</category>
                <author>Alireza Qazavi</author>
                <pubDate>Fri, 31 Mar 2023 13:48:57 +0330</pubDate>
            </item>
                    <item>
                <title>حل مشکل آپدیت نشدن pip در ویندوز 10</title>
                <link>https://virgool.io/@alirezaqazavi/%D8%AD%D9%84-%D9%85%D8%B4%DA%A9%D9%84-%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%D9%86%D8%B4%D8%AF%D9%86-pip-%D8%AF%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-10-iy6kudvw3rul</link>
                <description>پایتون شامل ابزاری به نام pip است که برای نصب بسته‌های شخص ثالث استفاده می شود. از آنجایی که پیپ به نصب بسته ها از منابع خارجی کمک می کند، اغلب برای رفع مشکلات امنیتی احتمالی به روز می‌شود. بنابراین، ما نیاز به به‌روزرسانی pip داریم:python -m pip install --upgrade pipقسمت اول این فرمان، python -m pip، به پایتون میگه تا ماژول pip را ران کنه. دومین قسمت، install --upgrade pip، به پیپ میگه تا پکیجی که قبلا نصب شده را آپدیت کنه. قسمت آخر، pip، مشخص میکنه کدوم پکیج شخص ثالث باید به روز بشه.مشکلی که پیش میاد ممکنه این باشه که این کامند عمل نکنه:آپدیت نشدن پیپ در ویندوز 10راه حل اینه که توی سرچ ویندوزتون بنویسد proxy و هرگونه فعال بودن پروکسی رو سیستمتون را غیرفعال کنین.غیرفعال کردن پروکسی های فعال روی سیسیتم در ویندوز 10</description>
                <category>Alireza Qazavi</category>
                <author>Alireza Qazavi</author>
                <pubDate>Wed, 28 Dec 2022 17:35:36 +0330</pubDate>
            </item>
                    <item>
                <title>تکنولوژی NOMA در مخابرات موبایل نسل پنجم چیست؟</title>
                <link>https://virgool.io/@alirezaqazavi/noma-cw2tbq3ujmbw</link>
                <description>ترجمه: علیرضا قضاوینوما (NOMA) مخفف دسترسی چندگانه نامتعامد (Non-Orthogonal Multiple Access) است. یعنی شما چندین کاربر دارید که به کانال دسترسی دارند، بنابراین در اینجا من یک تصویر با یک ایستگاه پایه و دو کاربر دارم، بیایید به مورد دو کاربره در این مقاله نگاه کنیم، بنابراین این کاربر یک و کاربر دو و ایستگاه پایه است. و از ایستگاه پایه‌ای که داریم اگر به صورت فروسو (Downlink) به دو کاربر نگاه کنیم (بنابراین در این مقاله بر ارتباط فروسو تمرکز می‌کنیم)، هر کاربر دارای یک بهره کانال (Channel Gain) است که با بهره کانال کاربر دیگر متفاوت است. بنابراین ما این دو بهره کانال مختلف در این کانال ارتباطی بی‌سیم را h1 و h2 می‌نامیم.نمایش مدل سیستمحالا بیایید یک لحظه فکر کنیم اگر تمام توان خود را روی سیگنالی که به کاربر 1 ارسال می‌کنیم بگذاریم و سعی کنیم هیچ چیزی به کاربر 2 ارسال نکنیم، سیگنالی در کاربر 1 دریافت می شود که برابر است با بهره کانال برای استفاده از کاربر یک ضربدر توان ضربدر نقطه منظومه‌ی سیگنالی که به کاربر یک می‌فرستیم به اضافه نویز دریافتی در کاربر یک و این کانالی است که ظرفیت دارد. اگر می خواهید در مورد ظرفیت و نرخ کد (Code Rate) بیشتر بدانید، این ویدئو را ببینید. بنابراین این لینکِ مابین ایستگاه پایه و کاربر یک، یک ظرفیت داشته و مهمتر از آن، این ظرفیت به یک نرخ کد پیوند می‌خورد. و این یک مفهوم مهم برای این ویدیو در اینجا است، بنابراین اگر با ظرفیت و نرخ کد آشنا نیستید، توصیه می‌کنم ویدیو را در این لینک  مشاهده کنید.بنابراین این لینک یک ظرفیت خواهد داشت. فرض کنید ما تمام توان را فقط برای استفاده از کاربر 1 قرار داده‌ایم و کاربر 2 را نادیده گرفتیم، سپس این نرخ کد (R1) را به ما میدهد و من میخواهم آن را در این جا در این نمودار رسم کنم، به طوری که این نرخ را به ما می‌دهد و آنچه قانون ظرفیت شانون می‌گوید این است که ما می‌توانیم هر نرخی را از 0 تا آن نرخ R1 ارسال کنیم و این کار را بدون هیچ گونه خطایی انجام دهیم اگر بخواهیم فراتر از آن نرخ ارسال کنیم، شروع به دریافت خطا خواهیم کرد. بنابراین این یک ظرفیت برای کاربر یک است.ظرفیت R1 بدون در نظر گرفتن کاربر2اگر در عوض کاربر یک را نادیده بگیریم و تمام توان خود را برای کاربر دو ارسال کنیم چه می‌شود؟در این صورت ما h2 و تمام توان ارسالی را برای x2 را خواهیم داشت به علاوه نویز، دقیقاً یکسان با مورد قبل خواهد بود.ظرفیت R2 بدون در نظر گرفتن کاربر1البته برای کاربر 2 نرخی خواهیم داشت و این نرخ را R2 می‌نامیم و این می‌گوید که اگر ما تمام توان را برای ارسال به کاربر2 بدهیم، می‌توانیم به طور بیشینه تا چه نرخی به کاربر 2 داده ارسال کنیم.اکنون روشی که من این نمودار را ترسیم کردم برای اندازه h1 بزرگتر از اندازه h2 است، ما فقط امروز این سناریو را در نظر خواهیم گرفت. اما البته این سیستم کلی‌تر از آن است که من فقط از آن برای نشان دادن و توضیح اینجا استفاده می‌کنم، بنابراین بیایید این را در نظر بگیریم، نرخ R1 بزرگ‌تر از نرخ R2 است، زیرا ما از همان مقدار توان استفاده کرده‌ایم، بسیار خوب، بنابراین ما دقیقاً وقتی میخواهیم در واقع دسترسی چندگانه داشته باشیم چه میکنیم؟ اگر بخواهیم در واقع دسترسی چندگانه داشته باشیم، می‌خواهیم چیزی بین این کاربران به اشتراک بگذاریم، یکی از کارهایی که می‌توانیم انجام دهیم دسترسی چندگانه تقسیم زمانی است، این سیستمی است که احتمالاً با آن آشنا هستید. ما زمان را به شکاف‌ها تقسیم می‌کنیم و اولین بخش از آن زمان به کاربر یک تخصیص داده و در بخش دوم به کاربر دو داده می‌فرستیم و این به ما فرصتی می‌دهد تا بر روی هر جفت نرخی در این خط مستقیمِ اُریب کار کنیم.نمایش خط مستقیم اریبخوب است، بنابراین اگر 50 درصد از زمان خود را برای کاربر 1 بگذاریم، آنگاه نرخی را که به کاربر 1 می فرستیم برای نیمی از زمان دریافت کرده و سپس نیمی دیگر از زمان، نرخی را که برای کاربر 2 استفاده کرده‌ایم، دریافت می‌کنیم. بنابراین میانگین آن دو نرخ را دریافت می‌کنیم، زیرا آنها در زمان به اشتراک گذاشته شده‌اند و متعامد هستند زیرا  آنها داده های دو کاربر را به صورت همزمان ارسال نمی‌کنند، بنابراین به طور کلی، این یک نسخه از چیزی است که دسترسی چندگانه متعامد نامیده می‌شود.بسیار خوب، من فکر می‌کنم که اگر من در هر نقطه ای از این خط مستقیم اریب باشم، متوجه خواهید شد که این به شما یک خط مستقیم اریب از این معنایی که گفتیم را می‌دهد، بنابراین من یک جفت نرخ، یک نرخ برای کاربر دو و یک نرخ برای کاربر یک دارم که آنها به طور میانگین دریافت می‌شوند.بنابراین راه دیگری که می توانید در مورد این فکر کنید این است که اگر من برای کاربر 1 ارسال می کردم و شروع به ارسال به کاربر 2 می کردم، می توانم با کاهش نرخ کاربر 1، مصالحه (trade-off) انجام دهم و این به من امکان می دهد نرخ کاربر 2 را افزایش دهم و اگر من این کار را با TDMA انجام می‌دهم بنابراین آن مبادله در این خط مستقیم اتفاق می‌افتد. بسیار خوب، پس این دسترسی چندگانه متعامد (OMA) است.OMAحال این دسترسی چندگانه غیرمتعامد چیست. برای دسترسی چندگانه غیرمتعامد، ما داده‌های دو کاربر را به طور همزمان ارسال می‌کنیم و نتیجه این است که می‌توانیم بهتر از این خط مستقیم انجام دهیم، یعنی در سمت راست این خط مستقیم قرار خواهیم گرفت. بنابراین R1 به علاوه R2 بیشتر از وضعیت متعامد خواهد بود، بنابراین بیایید بفهمیم که چیست، بنابراین کاری که می‌خواهیم انجام دهیم این است که اجازه دهید p1 را به عنوان توانی که به کاربر 1 ارسال می‌کنیم و p2 را به عنوان توانی که برای کاربر 2 تخصیص می دهیم تعریف کنیم و البته، جمع آن‌ها باید برابر با p باشد که در TDMA داشتیم، بنابراین در دسترسی چندگانه متعامد، p را با روشن کردن ارسال برای کاربر یک برای مدت معین و سپس روشن کردن ارسال برای کاربر2 برای مدت معینی به اشتراک گذاشتیم.تخصیص توان در CDMAاکنون می‌خواهیم توان کل p را با ارسال با تقسیم کردن آن به اشتراک بگذاریم، اما همیشه برای هر دو کاربر ارسال می‌کنیم، خوب است، بنابراین بیایید به این فکر کنیم که در یک سناریوی خاص چه اتفاقی می‌افتد، بیایید به این سناریو در اینجا فکر کنیم که در آن h1 قوی‌تر از h2 است. من فقط از یک مثال برای شروع استفاده می کنم، اما من به شما نشان می دهم که کلی تر از آن است، اما بیایید فکر کنیم برای مثال h2 کوچک است، بنابراین کانال بدتری دارد، بنابراین اجازه دهید فقط یک لحظه فکر کنید که ما تصمیم می گیریم توان بیشتری را در سیگنالی که به کاربر 2 ارسال می کنیم قرار دهیم. بنابراین p2 بزرگتر است و این انتخاب ماست که باید آن را انتخاب کنیم، بنابراین فرض کنید ما p2 را بزرگتر از p1 انتخاب کرده ایم. فرض کنید ما آن را بسیار بزرگتر انتخاب می‌کنیم.فقط برای مثال در مورد آن مورد فکر کنیم تا با آن شروع کنیم، بنابراین فرض کنید می خواهیم p2 را بسیار بزرگتر کنیم، اجازه دهید به گیرنده در کاربر 2 فکر کنیم. بنابراین من می‌خواهم معادله را در این‌جا برای گیرنده در کاربر2 بنویسم. بنابراین y2 است در این مورد کاری که ما می‌خواهیم انجام دهیم این است که خوب بفرستیم اجازه دهید من اول از همه بگویم چه چیزی می‌فرستیم.بنابراین اکنون ما در حال ارسال p1 ضربدر x1 به اضافه p2 برابر x2 هستیم، این همان چیزی است که در NOMA در لینک فروسوی یک سیستم ارتباطی سیار 5g ارسال می‌کنیم که ایستگاه پایه همزمان سیگنال نقطه منظومه برای x1 ضربدر توانی که برای ارسال به کاربر1 تخصیص داده‌ایم را برای کاربر یک ارسال می‌کند. به علاوه، در همان زمان، نقطه منظومه را برای x2 ضربدر توانی که به کاربر 2 اختصاص می‌دهیم را ارسال می‌کند. بنابراین این سیگنال ارسالی توسط ایستگاه پایه ارسال می شود.بنابراین اگر در کاربر 2 هستید، سیگنال ضربدر h2 را دریافت خواهید کرد زیرا از کانال h2 عبور کرده است، بسیار خوب، سیگنالی است که در آنجا ارسال شده و از کانال h2 عبور کرده است و در موقعیت کاربر2 نویز w2 وجود دارد.سیگنال دریافتی در کاربر2خوب پس اجازه دهید آن را گسترش دهم تا کمی بیشتر شبیه مورد متناظر در OMA به نظر برسد و خواهیم دید که چرا فقط در یک دقیقه پس از این می خواهم عبارت مورد علاقه شما را در کاربر 2 جمع آوری کنم. پس شما به x2 علاقه مند هستید، بنابراین شما h2 را دارید که فقط این براکت ها را گسترش می دهد h2 p2 x2 به علاوه h2 p1 x1 به علاوه w2 این چیزی است که شما دارید، من به تازگی آن براکت ها را گسترش داده ام اکنون اجازه دهید به این جملات همانطور که گفتم نگاه کنیم. فقط برای مثال، ما فقط این را در نظر می گیریم که در حال حاضر می خواهیم موردی را در نظر بگیریم که در آن p2 بزرگ است، بنابراین ما انتخاب کرده ایم که p2 را بزرگ کنیم، بنابراین در این مورد p1 کوچک است، بنابراین این عبارت (جمله اول) در اینجا p1 کوچک و h2 کوچک است، بنابراین این عبارت (عبارت اول) در اینجا یک عدد کوچک است، این یک عدد کوچک خواهد بود و شبیه نویز خواهد بود.سیگنال دریافتی در کاربر2 در مدل سیستم نومافرض کنید در حالت شدید که p2 بسیار بزرگ است و p1 بسیار کوچک است و شما آنها را انتخاب کرده اید، بنابراین کل این عبارت (عبارت اول) در اینجا مانند نویز به نظر می‌رسد و شما می توانید آن را دقیقاً همان چیزی را که در OMA رمزگشایی کرده‌اید، هنگامی که به تازگی به y2 ارسال می شد و هیچ مولفه ای از x1 وجود نداشت، رمزگشایی کنید. بنابراین در این مورد، می توانید این معادله مربوط به NOMA را در اینجا مشاهده کنید که شبیه آن معادله مربوط به OMA است با این تفاوت که به جای داشتن w2 برای نویز سفید جمع شونده گوسی در حال حاضر، یک نویز بزرگتر وجود دارد. از تقویت کننده های موجود در گیرنده ای که دارید.اکنون یک عبارت اضافی دریافت کردم، اما چون p1 کوچک است و h2 کوچک است، هنوز هم همه چیز مانند نویز به نظر می رسد، بنابراین می توانید این سیگنال را با آشکارسازی مستقیم رمزگشایی کنید، بنابراین من می‌خواهم اینجا بنویسم آشکارسازی مستقیم. این همان چیزی است که شما برای کاربر2 دارید.بسیار خوب، اکنون به همان میزان نرخی که اگر تمام توان را به y2 ارسال کنید، نخواهید رسید، زیرا اکنون توان کمتری را به y2 می فرستید و نویز کمی بیشتر است، بنابراین نمی توانید آن نرخ کامل را دریافت کنید و نرخ کمتری دریافت می‌کنید، اما تفاوتی که می‌توانید بفهمید این است که اکنون در حالی که شما ارسال می‌کنید، مجبور نخواهید بود تمام مدت زمان را به اشتراک بگذارید، همانطور که در tdma انجام دادید و می‌توانید در کل زمان ارسال را انجام دهید.بنابراین شما نرخ کمتری دریافت می‌کنید اما آن را برای همیشه دریافت می‌کنید و همچنین می‌توانید چیزی به y1 ارسال کنید، بنابراین چه چیزی می‌توانید به y1 ارسال کنید، این معادله با شاخص‌ها معکوس خواهد شد، بنابراین اکنون شما داریدy1=h1p1x1+h1p2x2+wرا دریافت می‌کنید.سیگنال دریافتی در کاربر1 در حالت NOMAحالا بیایید به این سناریو در اینجا فکر کنیم حالا در کاربر یک، y1 چیزی که می‌بینید این است که کاربر با کانال بهتری است اما ممکن است کانال بهتری داشته باشد اما در این مثال ما فکر می کنیم با توجه به توان کمتری که p1 دریافت کرده است. بنابراین در این مورد، این یکی (جمله دوم y1) هنوز هم یک جمله مهم خواهد بود، آنطور که برای استفاده در کاربر دو بود کوچک نخواهد بود. بنابراین این جمله برای کاربر1، یک عبارت تداخلی دیگر شبیه نویز نخواهد بود، زیرا شما به آن توان بسیار زیادی دادید، بنابراین p2 بسیار خوب است، بنابراین این عبارت (جمله دوم y1 در نوما) را نمی توان در این سناریوی توانی که در مورد آن صحبت کردیم به عنوان نویز در نظر گرفت.بنابراین این مانند نویز نیست، بنابراین چه کاری می‌توانیم انجام دهیم، از آنجایی که ما با نرخی کمتر از ظرفیت ارسال می‌کنیم، می‌توانیم این بخش از سیگنال (جمله دوم y1) را دقیقاً همانطور که در کاربر 2 انجام دادیم شناسایی و رمزگشایی کنیم. بنابراین ما در کاربر 1 هستیم، اما همچنان ابتدا سیگنال کاربر 2 را شناسایی و رمزگشایی می کنیم، بنابراین می خواهیم این کاربر2 را در اینجا شناسایی و رمزگشایی کنیم تا کاربر 2 به این مولفه (جمله دوم y1) در سیگنال دریافت شده در کاربر 1 سیگنال دهد.ما مولفه کاربر 2 را در کد شناسایی می کنیم، زیرا ساده نیست، P2 دارد، ناچیز نیست، شبیه نویز نیست، اما در عوض، آن را شناسایی و رمزگشایی می کنیم و سپس از لغو تداخل متوالی برای حذف آن، استفاده می کنیم.SICبنابراین ما آن را کم می کنیم و تا زمانی که کار شناسایی و رمزگشایی خود را به خوبی انجام داده ایم، تخمین خوبی خواهیم داشت، من یک کلاه بالای آن قرار می دهم تا بگویم که این یک تخمین است. اما چون این رمزگذاری شناسایی را با نرخ کمتر از ظرفیت انجام داده‌اید، تخمین خوبی دریافت خواهید کرد و بنابراین این عبارت در اینجا دقیقاً این عبارت را لغو می‌کند و تنها چیزی که در اینجا در کاربر 1 باقی می‌ماند h1 p1 x1 + w1 است. البته این عبارت در اینجا بدون اینها به نظر می رسد با لغو شده دقیقاً مانند مورد TDMA بالا به نظر میرسد.خوب، اکنون در این مورد اینجا و دوباره شما مجبور نیستید زمان را در اینجا به اشتراک بگذارید، بنابراین همیشه آن را دریافت می کنید، بنابراین نرخ پایین تری دریافت می کنید، اما همیشه آن را دریافت می کنید، خوب است.برای کاربر 2 باید از آشکارسازی مستقیم استفاده کنید. سپس برای کاربر 1، ابتدا باید کاربر 2 را شناسایی و رمزگشایی کنید و سپس از لغو تداخل متوالی برای لغو آن استفاده کنید و سپس سیگنال کاربر یک را دریافت کنید.ناحیه نرخ متوسط نومابسیار خوب، بنابراین آنچه که به ما می‌دهد یک جفت نرخ است و آن جفت نرخ به ما یک منحنی می‌دهد که شبیه این است و این منحنی در اینجا ناحیه‌ای برای دسترسی چندگانه متعامد است، اما این منطقه برای دسترسی چندگانه غیرمتعامد است که ناحیه بزرگتری است. بنابراین به این معنی است که در مجموع نرخ بیشتری دریافت می‌کنید، که یکی از دلایلی است که انجام NOMA کار خوبی است.من در مورد مثالی صحبت کردم که در آن تصمیم گرفتیم توان بیشتری به کاربر2 بدهیم، اما اگر تصمیم گرفتیم این کار را برعکس انجام دهیم چه می شود و کجا ما را رها می‌کند، شاید اول از همه بگوییم که ما را در کجای نمودار قرار می‌دهد، بنابراین توان بیشتر برای استفاده از کاربر دو به این معنی است که ما به نرخ کامل این منحنی برای کاربر دو نزدیک‌تر هستیم.فراموش نکنید که هر نقطه در امتداد این منحنی ترکیب متفاوتی از p1 و p2 است، بنابراین در این مورد که p2 بزرگ است، ما در مورد نرخ یک جفت نرخ در اینجا صحبت می کنیم، بنابراین در اینجا نرخ به کاربر 2 بالا و نرخ به کاربر1 پایین است. به طور کلی این همان چیزی است که شما را در منحنی قرار می دهد.بیایید فکر کنیم که اگر توان‌ها را عوض کنیم، باز هم آشکارسازی خود را به همان روش انجام می‌دهیم؟بنابراین فرض کنید ما p1 را بسیار بزرگ و p2 را بسیار کوچک کردیم تا نقطه متفاوتی را در این منحنی نرخ انتخاب کنیم و ببینیم آیا هنوز هم آشکارسازی خود را به همان روش انجام می دهیم ؟و البته شما همیشه نمی‌خواهید توان بیشتری به کاربر2 بدهید. فقط به این دلیل که این کاربر2 دورتر هست و کانال آن بد است زیرا ممکن است کاربر دو دستگاه اینترنت اشیا با نرخ بسیار پایین باشد، در حالی که کاربر 1 ممکن است یک دستگاه ویدیویی باشد که به ویدیوی با نرخ بالا نیاز دارد، بنابراین شما باید بتوانید روی این منحنی حرکت کنید و شما نمی‌توانید به سادگی در انتخاب توان خود بر اساس h1 و h2 محدود باشید.و این یک چیز بسیار مهم و حیاتی است، اغلب چیزی است که مردم در مورد آن گیج می‌شوند و فکر می‌کنند باید توان بیشتری را به کاربر ضعیف‌تر در NOMA بدهند، اما اینطور نیست.بیایید به این مورد نگاه کنیم، فرض کنید به کاربر قوی‌تر توان بیشتری داده‌اید و می‌دانید که آن یک کانال ویدیویی هست، برای مثال به نرخ بالایی نیاز دارد.آیا هنوز هم آشکارسازی را به این روش انجام می‌دهید یا ترتیب آشکارسازی را برمیگردانید، آیا اکنون باید آشکارسازی مستقیم برای کاربر یک و لغو تداخل متوالی برای کاربر دو انجام دهید و پاسخ این است که نه، ترتیب رمزگشایی به ترتیب معکوس بهره‌های کانال‌ها است، بنابراین شما همیشه ابتدا h2 را رمزگشایی کنید، در این مثال در اینجا ابتدا h2 را رمزگشایی کردیم و آن را به عنوان نویز در نظر گرفتیم و برای کاربر 1 نیز ابتدا h2 داده کاربر2 را آشکار کرده و سپس داده کاربر1 را رمزگشایی کردیم.بنابراین کاربر ضعیف‌تر همیشه ابتدا رمزگشایی می‌شود، این قانون است، پس چرا اجازه دهید من فقط به شهود فکر کنم زیرا ما از قدرت شهود استفاده کردیم تا بگوییم که باید این کار را به روش اول انجام دهیم، حالا من توان‌ها را تغییر داده‌ام چرا ترتیب آشکارسازی را تغییر نمی‌دهیم؟، نکته مهم دانستن و درک این است که ما برای دریافت این که که آیا رمزگشایی چیزی آسان است یا نه فقط در مورد توان صحبت نمی کنیم.نکته مهم در اینجا این است که شما فریب می خورید و فکر می کنید که ما با همان نرخ ارسال می کنیم وقتی من این معادله (y2 برای نوما) را به این شکل می‌نویسم، بنابراین این معادله اینجاست که می گوییم p1 ضربدر x1 به اضافه p2 برابر x2.چیزی که به طور بالقوه پنهان می شود، این واقعیت است که به نظر می رسد ما در حال تلاش برای ارسال سیگنال‌هایی از منظومه‌های یکسان به دو کاربر هستیم، اما اینطور نیست.دو کاربر با نیازمندیهای نرخ متفاوت و منظومه های ارسال مختلفبنابراین بیایید آن مثالی را که قبلاً در مورد آن صحبت کردم، مثال بزنیم، مثلاً فرض کنیم کاربر یک یک کانال ویدیویی است و کاربر دو یک دستگاه اینترنت اشیا کوچک است که به نرخ زیادی نیاز ندارد، سپس شما از یک منظومه بسیار چگال برای کاربر یکی که x1 را ارسال می‌کند، ارسال می‌کنید، زیرا داده های زیادی را با سرعت بالاتری ارسال می کنید.بنابراین وقتی اینجا روی منحنی هستید و اینجا برای کاربر یک، منظومه بالاتری را ارسال می کنید، بنابراین می‌توانید با نرخ بالاتری برای کاربر یک ارسال کنید، همچنین برای کاربر دو منظومه پایین تری را ارسال می‌کنید که آشکارسازی و رمزگشایی آن بسیار آسان تر است. این فقط یک bpsk است.خوب و این نکته مهم است و این همان چیزی است که شما باید در مورد اینکه چرا هنوز به این روش رمزگشایی می کنید فکر کنید، به عنوان مثال، اجازه دهید من به این مورد در اینجا این مثال اینجا نگاه کنم و بگویم خوب می دانید که ما این موضوع را می گفتیم: در اینجا اگر p1 نداشتیم اگر p1 در واقع قوی تر بود و p2 کوچکتر بود، این عدد در اینجا اگر p2 کوچکتر است سناریوی جدیدی که به آن نگاه می کنم، این عدد کوچک خواهد بود و شاید بیشتر شبیه نویز باشد. فراموش نکنید اگر چه این مقدار کوچک است اگر x2 از منظومه ای می آید که به راحتی قابل تشخیص است، باز هم تشخیص آن در ابتدا و انجام حذف متوالی تداخل در مقایسه با این بخش از سیگنال به طور بالقوه آسان تر خواهد بود.بنابراین اگر این بخش از سیگنال حتی اگر قدرت بیشتری دریافت کند که سناریوی دومی است که اکنون در مورد آن صحبت می کنیم، حتی اگر این بخش از یک منظومه به این شکل باشد، قدرت بیشتری داشته باشد.پس فقط توان مهم نیست، ترکیب توان با منظومه مهم است، بنابراین توان زیاد است، اما اگر منظومه چون نرخ ارسال زیاد است، منظومه متراکم باشد، پس انجام آشکارسازی دشوار است، بنابراین حتی اگر توان p1 باشد و قوی باشد، شما هنوز هم ابتدا p2 را رمزگشایی می کنید زیرا  داده ها با توان p2 برای کاربر2 با نرخ بسیار کمتری ارسال می شود زیرا در اینجا نرخ پایین برای R2 است و بنابراین با یک منظومه آسان برای آشکارسازی ارسال می‌شود.بنابراین شما هنوز هم ابتدا کاربر با کاننال ضعیفتر را آشکارسازی می کنید، بنابراین این یک مفهوم مهم در NOMA از نظر رمزگشایی است: همیشه ضعیف ترین کاربر یا کاربری با بدترین کانال در اولویت آشکارسازی است.بنابراین سه نکته دیگر وجود دارد که من در مورد NOMA فکر می‌کنم فقط برای اتمام کار مهم است فراموش نکنید یا مهم است که متوجه شوید برای اجرای این عملیات، اطلاعات وضعیت کانال، مقادیر h1 و h2 باید در ایستگاه پایه و پایانه های کاربر شناخته شوند.شما باید آن اطلاعات را در مورد کانال داشته باشید و انجام این کار در سناریوهای بی سیم کانال محو شده همیشه آسان نیست، بنابراین یک مسئله برای پیاده سازی اطلاعات وضعیت کانال CSI باید در همه جا شناخته شود، نکته دیگر این است که بهره این منحنی NOMA به h1 و h2 بستگی دارد و معلوم می شود که اگر h1 برابر با h2 باشد، این منحنی در اینجا در واقع سقوط می کند تا خط مستقیم دسترسی چندگانه متعامد باشد، بنابراین اگر کاربرانی را انتخاب کنید که کانال‌های تقریباً برابری دارند، NOMA به شما هیچ فایده ای نمی‌دهد یا اگر آنها را دقیقاً مساوی انتخاب کنید، NOMA در مقایسه با دسترسی چندگانه متعامد به شما هیچ سودی نمی‌دهد.شکل این منحنی به h1 و h2 و تفاوت بین آنها بستگی دارد و سومین نکته آخری که باید بگوییم این است که نظری مانند آنچه قبلاً دادم این است که شاید حتی اگر در اینجا سود دارید ممکن است نخواهید در عمل NOMA انجام دهید. اگر این اختلاف بین برنامه‌ها را دارید، به عنوان مثال همانطور که قبلاً گفتم، اگر این سناریو را داشتید که قوی‌ترین کاربر در آن قرار داشت یا اگر این سناریو معکوس است که قبلاً گفتم، بنابراین بیایید بگوییم قوی‌ترین کاربر، کاربری با بهترین کانال است. شاید این یک دستگاه اینترنت اشیا کوچک باشد، شاید یک گره حسگر کوچک باشد.سپس باید اگر در noma باشد باید سیگنال دیگر را شناسایی و رمزگشایی کند و سیگنال دیگر ممکن است یک جریان ویدیویی با نرخ بالا از کاربر دیگر باشد و بنابراین این سوال در عمل این است که در عمل یک دستگاه اینترنت اشیا کوچک با باتری محدود واقعاً می‌خواهد یک کد ویدیویی با نرخ بالا را رمزگشایی کند تا بتواند سیگنال کوچک خود را دریافت کند و بنابراین اینها برخی از چالش‌های پیاده‌سازی noma هستند.مزیت این است که شما یک مصالحه بینهایت بین میزان داده ای که به کاربر یک ارسال می کنید و کاربر دو دریافت می کند و محدودیت زمانی در tdma ندارید. این نوع بی نهایت توانایی برای تنظیم نرخ های مختلف و کیفیت خدمات به طوری است که جنبه مثبت آن است و به طور کلی کمی ظرفیت بیشتری دریافت می کنید، اما چالش هایی نیز وجود دارد.منبع:https://www.youtube.com/watch?v=XCNz32T3ZbA</description>
                <category>Alireza Qazavi</category>
                <author>Alireza Qazavi</author>
                <pubDate>Wed, 04 May 2022 17:31:18 +0430</pubDate>
            </item>
                    <item>
                <title>معادل دستور ... در متلب برای پایتون</title>
                <link>https://virgool.io/@alirezaqazavi/%D9%85%D8%B9%D8%A7%D8%AF%D9%84-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-%D8%AF%D8%B1-%D9%85%D8%AA%D9%84%D8%A8-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-syh9brptcsv1</link>
                <description>کسانی که معمولاً متلب کار میکرده اند و میخواهند به پایتون مهاجرت کنند گاهی دنبال ویژگی هایی میگردند که قبلاً در متلب دیده بودند.در متلب از کاراکتر ... در انتهای خط به منظور جلوگیری از طولانی شدن خطوط برنامه استفاده میکردیم.معادل این دستور در پایتون continuation character نام دارد و یک بَک اسلش ساده است:\خبر خوب اینکه حتا با یک Enter ساده هم میتوانید خط را ادامه دهید و خودِ پایتون ادامه خط را میفهمد!پس هم میتوانید بَک اسلش را بگذارید و هم میتوانید به راحتی Enter را بزنید و خط را ادامه دهید.</description>
                <category>Alireza Qazavi</category>
                <author>Alireza Qazavi</author>
                <pubDate>Fri, 29 Apr 2022 15:48:07 +0430</pubDate>
            </item>
            </channel>
</rss>