當前位置:首頁 » 編程語言 » c語言曲線擬合

c語言曲線擬合

發布時間: 2022-08-21 16:55:43

『壹』 曲線擬合 最小二乘法 c語言程序

去翻一下,計算方法或者數值分析的書吧。有公式,你按那公式求就可以了。

一樓用的是列主元消去法(跟高斯消去法差不多,就多了一個選主元(絕對值最大))

對於解AX=b,平方根法要求A是對稱且正定矩陣
由於平方根法裡面要計算根號,計算量就比較大,而且工程中的A不一定都是正定的。所以在工程中採用改進的平方根法(它解出來的解與真解有一點誤差,但是相當相近),也就是說A只要對稱就行了。

『貳』 C語言曲線擬合原理

雖然我知道什麼是曲線擬合,怎麼做,但是我不清楚你問題的具體內容,
從chuaike24的回答
「請高手 說實話 我是菜鳥 但你的程序感覺好凌亂 好多地方可以精簡說最明顯的問題 power函數返回值無論怎樣都返回0 」來看,我可能是沒看到你的程序,所以信息不全。
我只回答什麼是曲線擬合
曲線擬合,簡單來說,是指以近似的方法用一條曲線逼近一組數據點。
逼近的方法最常用的事最小二乘法,當然也有其他方法。
逼近的曲線可以是直線,也可以是多項式曲線,二次,三次,多次,也可以是分段多項式曲線,也可以是B樣條曲線。在這里,如果不需要深入研究,你只要把B樣條曲線理解為一種近似於分段多項式曲線即可。
你問的不多,這些對你的回答已經足夠,需要深入了解再問

『叄』 雙曲線數據擬合c語言演算法編程

不建議使用C語言來實現曲線擬合。
這種數學問題用matlab很容易就可以解決,c語言寫要麻煩的多的多。比如你採用最小二乘法的話,
你需要自己用c語言寫很多矩陣運算。
必須做的話,參考一下這個吧:http://wenku..com/link?url=-

『肆』 急~~~~~~!!!求解!用C語言編寫最小二乘法求數據的擬合曲線~並做出圖顯示擬合效果!高分懸賞!

#include<stdio.h>
#include<math.h>

void Guass(int n,float Array[][10])
{
float s,u;
int i,j,k,a,x,y;
for(i=0;i<n-1;i++)
{
s=Array[i][i];
k=i;
for(a=i+1;a<n;a++)
{
if(fabs(s) < fabs(Array[a][i]))
{
s=Array[a][i];
k=a;
}
}
if(k!=i)
{
for(j=i;j<n+1;j++)
{
u=Array[i][j];Array[i][j]=Array[k][j];Array[k][j]=u;
}
}
for(x=i+1;x<n;x++)
{
u=Array[x][i]/s;
for(y=i;y<n+1;y++)
{
Array[x][y]=Array[x][y]-u*Array[i][y];
}
}
}
for(x=n-1;x>=0;x--)
{
s=0;
for(y=x+1;y<n;y++)
s=s+Array[x][y]*Array[y][n];
Array[x][n]=(Array[x][n]-s)/(Array[x][x]);//得到結果
}
for(i=0;i<n;i++)printf("%f ",Array[i][n]);printf("\n");
}

int main()
{
int n,i,j;
float Array[10][10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
scanf("%f",&Array[i][j]);
}
Guass(n,Array);
return 0;
}
你的串號我已經記下,採納後我會幫你製作

『伍』 用VC++編一個曲線擬合程序

在windows環境下編程序,最傳統的方法是Win32 API,歷史極其悠久,核心內容自從windows誕生至今幾乎沒變化。他很龐大,包括界面部分(即GDI),還有消息處理部分(要讓滑鼠拖動就要使用滑鼠消息),還有文件,列印,網路等等功能,他作為Windows最直接的編程方法,至今都很重要。Win32 API是使用C語言的,為了發揮C++的優勢,微軟基於Win32 API,開發了MFC,他就是Visual C++的主要功能之一。我比較懶,也不高興學MFC,畢竟做的程序簡單,體現不出MFC的優勢,如果程序中控制項(例如按鈕,文本)比較多,窗口較多,那麼用MFC就方便很多。

樓主要求的程序,不是很復雜,用純粹的C語言,使用Win32API,就可以了,樓主要學的話看一下WIN32 API的書,當然你也可以學MFC,前提要對C++比較熟悉,類,繼承,多態一定要搞清楚。

我寫了一下,代碼如下:
#include <windows.h>
#include <math.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int cxClient, cyClient ,cByteWidth;
POINT apt[5] ;
bool requestRedraw;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
//入口點,就是main函數
static TCHAR szAppName[] = TEXT ("Bezier") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
//創建一個窗口
hwnd = CreateWindow (szAppName, TEXT ("Bezier Splines"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
//建立消息循環,來接受滑鼠動作,窗口縮放,移動等動作
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

void DrawBezier (HDC hdc,HDC hdcMem)
{
//這里是畫曲線,通過打點的方式畫到點陣圖中,然後顯示,當然演算法有待改進
static char bits [259200];
if(requestRedraw)
{
memset(bits,0xFF,259200);
float tDelat = 0.025/max(cxClient,cyClient);
for(float t = 0 ; t < 1 + tDelat ; t += tDelat)
{
float mt = 1 - t;
float t2 = t * t,t3 = t2 * t,t4 = t3 * t;
float mt2 = mt * mt,mt3 = mt2 * mt,mt4 = mt3 * mt;
int fX = apt[0].x * t4 + 4 * apt[1].x * t3 * mt + 6 * apt[2].x * t2 * mt2
+ 4 * apt[3].x * t * mt3 + apt[4].x * mt4 + 0.5f;
int fY = apt[0].y * t4 + 4 * apt[1].y * t3 * mt + 6 * apt[2].y * t2 * mt2
+ 4 * apt[3].y * t * mt3 + apt[4].y * mt4 + 0.5f;
bits[( fX + ((fY * cByteWidth) << 3)) >> 3] &= (0xFF ^ ( 0x80 >> ( fX & 0x07 ))) ;
}
requestRedraw = false;
}

HBITMAP hBitmap ;
BITMAP bitmap = { 0, cxClient, cyClient, cByteWidth, 1, 1 } ;
bitmap.bmBits = bits ;
hBitmap = CreateBitmapIndirect (&bitmap) ;
SelectObject(hdcMem,hBitmap);
BitBlt (hdc, 0, 0, cxClient, cyClient,
hdcMem, 0, 0, SRCCOPY) ;
DeleteObject(hBitmap);
//把點用直線連起來
static HPEN hRedPen = CreatePen (PS_SOLID, 1, RGB (255, 0, 0)) ;
SelectObject(hdc,hRedPen);
MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;
LineTo (hdc, apt[1].x, apt[1].y) ;
LineTo (hdc, apt[2].x, apt[2].y) ;
LineTo (hdc, apt[3].x, apt[3].y) ;
LineTo (hdc, apt[4].x, apt[4].y) ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//消息循環處理函數
static HDC hdc,hdcMem;
static PAINTSTRUCT ps ;
static int chosen = -1,minDistance = 1e3 ;
switch (message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;
hdcMem = CreateCompatibleDC (hdc) ;
ReleaseDC(hwnd,hdc);
return 0 ;
//當窗口大小改變,要重新畫曲線
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
cByteWidth = int(ceil(cxClient / 8.0f))%2 == 0 ? ceil(cxClient / 8.0f) : ceil(cxClient / 8.0f)+1;
apt[0].x = 1 * cxClient / 6 ; apt[0].y = 1 * cyClient / 2 ;
apt[1].x = 1 * cxClient / 2 ; apt[1].y = 1 * cyClient / 6 ;
apt[2].x = 1 * cxClient / 2 ; apt[2].y = 4 * cyClient / 5 ;
apt[3].x = 2 * cxClient / 3 ; apt[3].y = 4 * cyClient / 5 ;
apt[4].x = 4 * cxClient / 5 ; apt[4].y = 1 * cyClient / 3 ;
chosen = -1;
requestRedraw = true;
return 0 ;
//滑鼠點擊,計算出選擇哪一個要移動的點
case WM_LBUTTONDOWN:
minDistance = 1e3; chosen = -1;
for(int i = 0 ; i <5 ; i++ )
{
int dx = LOWORD (lParam) - apt[i].x ; int dy = HIWORD (lParam) - apt[i].y ;
int currentDist = dx*dx + dy*dy;
if(currentDist < minDistance)
{
minDistance = currentDist;
chosen = i;
}
}
return 0;
//滑鼠移動,讓點跟隨滑鼠
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON && chosen >= 0)
{
apt[chosen].x = LOWORD (lParam) ;
apt[chosen].y = HIWORD (lParam) ;
requestRedraw = true;
PostMessage(hwnd,WM_PAINT,NULL,NULL);
}
return 0;
//這個是windows傳給程序的繪圖命令
case WM_PAINT:
InvalidateRect (hwnd, NULL, FALSE) ;
hdc = BeginPaint (hwnd, &ps) ;
DrawBezier (hdc,hdcMem) ;
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
不懂的話,可以Hi我

『陸』 c語言曲線擬合問題。已經有源代碼, 求高手修改符合要求!!!!

以你列舉的數據為例,一次運算是哪些數據?
輸入擬合多項式的次數:
5

輸入給定點的個數n及坐標(x,y):
5

?,?
?,?
?,?
?,?
?,?

你給出了10行數據?能做幾次運算?
結果為什麼是4個文件?那些數據寫第一個文件里去?
我看你的描述,反正得不到這些信息。

『柒』 C語言線性曲線擬合

可以直接在線進行擬合,下面是地址(已驗證)
http://3.14159.biz/math/Fit.html
建議你直接對數據用Matlab的cftool擬合(可以自由的自定義擬合函數形式)

熱點內容
安卓結束腳本 發布:2024-05-28 20:40:08 瀏覽:66
本地ubuntu伺服器搭建 發布:2024-05-28 20:40:03 瀏覽:100
地下城yg腳本 發布:2024-05-28 20:34:20 瀏覽:13
python元組刪除 發布:2024-05-28 20:32:46 瀏覽:794
微信拍了拍安卓怎麼用 發布:2024-05-28 20:18:08 瀏覽:704
cmd執行sql 發布:2024-05-28 19:46:51 瀏覽:866
棧初始化演算法 發布:2024-05-28 19:35:25 瀏覽:930
手機視頻怎麼上傳到qq空間 發布:2024-05-28 19:34:41 瀏覽:218
ftp三劍客作用 發布:2024-05-28 19:34:40 瀏覽:845
define在c語言中 發布:2024-05-28 19:23:44 瀏覽:349