plecs使用C-Script模块实现线性插值算法
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 一、定義插值函數
- 二、定義函數
- 1.getIndex
- 2.定義宏命令
- 3.指針的獲取
- 三、返回
- 總結
一、定義插值函數
在plecs打開C-Script代碼編寫模塊
double lininterp(double *x, double *y, int vectorLength, double xValue)
*x橫坐標向量,c語言中沒有現成的向量,故用指針來實現。
*y縱坐標向量。
又因為c語言里傳遞指針時無法傳遞指針的長度,所以還需要傳輸點的個數的數量vectorLength。
最后還需要插值的橫坐標xValue。所以就是根據橫縱坐標向量和向量長度,得到想要差值橫坐標的縱坐標。
double lininterp(double *x, double *y, int vectorLength, double xValue) {int index = getIndex(x, vectorLength, xValue);if(index == vectorLength - 1)return LINEAR_INTERPOLATION(x[index-1], y[index-1], x[index], y[index], xValue);elsereturn LINEAR_INTERPOLATION(x[index], y[index], x[index+1], y[index+1], xValue); }getIndex這個函數的功能是求出xValue在那兩個差值之間,并返回左邊那個點的索引值,賦給了index這個變量
除了遇到最右的區塊,返回最右邊的索引:index == vectorLength - 1。用最右的點與倒數第二個點進行差值。否則會溢出
宏命令LINEAR_INTERPOLATION實現知道X1,X2,Y1,Y2和X,返回Y
二、定義函數
1.getIndex
代碼如下(示例):
int getIndex(double *x, int vectorLength, double xValue) {int minIndex = 0;int maxIndex = vectorLength - 1;int middleIndex;if(xValue < x[minIndex])return minIndex;else if(xValue > x[maxIndex])return maxIndex;while(1){if(maxIndex - minIndex <= 1)return minIndex;middleIndex = (minIndex + maxIndex)/2;if(x[middleIndex] > xValue)maxIndex = middleIndex;elseminIndex = middleIndex;} }2.定義宏命令
代碼如下(示例):
#define LINEAR_INTERPOLATION(X1, Y1, X2, Y2, X) ( (Y2-Y1)/(X2-X1)*(X-X1) + Y1 )#define VECTOR_LENGTH ( ParamDim(0, 0)*ParamDim(0, 1) )分別定義插值和向量長度。向量長度是行數與列數的乘積
3.指針的獲取
setup處
code declaration部分,獲取
code中start function code部分,分配內存,并賦值
在仿真結束時釋放內存,在terminate function code
三、返回
調用lininterp函數
Output(0) = lininterp(x, y, VECTOR_LENGTH, fmod(CurrentTime, x[VECTOR_LENGTH - 1]));總結
提示:這里對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數據的函數和方法。
總結
以上是生活随笔為你收集整理的plecs使用C-Script模块实现线性插值算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php读取 Excel文件
- 下一篇: 用C#将PDF转换为Doc