c語言求直線方程
❶ c語言求直線方程最簡式
intgcd(inta,intb){
intk;
if(a>b){
k=a;a=b;b=k;
}
while(1){
intk=a%b;
if(k==0)returnb;
a=b;
b=k;
}
}
voidsimplify(int*coef,int*out){
intg=gcd(coef[0],coef[1]);
out[0]=coef[0]/g;
g=coef[1]/g;
out[1]=-g;
out[2]=coef[2]*g;
if(out[0]==1)printf("x");
elseprintf("%dx",out[0]);
if(out[1]==-1)printf("-y");
elseprintf("%dy",out[1]);
printf("+%d=0 ",out[2]);
}
intmain()
{
intn=0,i;
intcoef[3],out[3];
charstr[256];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("y=%d/%dx+%d",&coef[0],&coef[1],&coef[2]);
simplify(coef,out);
}
return0;
}
❷ C語言 解線性方程組
給,下面的代碼已經編譯運行確認,肯定好用了,試試吧:)
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d
float A[NUMBER][NUMBER+1] ,ark;
int flag,n;
void exchange(int r,int k);
float max(int k);
void message();
int main()
{
float x[NUMBER]; /*此數組用於存放方程解*/
int k,i,j;
char celect;
system("cls");
printf("\n用Gauss列主元消元法解線性方程組");
printf("\n1.解方程組請按Enter.");
printf("\n2.退出程式請按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n 輸入方程組的維數:n=");
scanf("%d",&n);
printf("\n現在輸入系數矩陣A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n請輸入a%d1--a%d%d系數和向量b%d: \n",i,i,n,i);
/*實現將每一行中的系數和向量一次性輸入,數之間用空格格開,輸完後回車確定*/
for(j=1;j<=n+1;j++) /*將剛才輸入的數存入數組*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判斷方程是否為線性方程,即是否合法*/
{
printf("\n此方程組不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf("\nx%d=%f",i,x[i]);
}
message();
getch();
return 1;
}
void exchange(int r,int k) /*交換行的矩函數*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}
float max(int k) /*比校系數大小的函數*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}
void message() /*實現菜單選擇的函數*/
{
printf("\n 繼續運算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n不合法的輸入!");message();}
}
}
❸ C語言中用什麼函數求方程參量
這里需要知道一個隱含的條件:ax+by+c=0是一條直線。兩點確定一條直線,所以這里需要充分利用這兩條來求直線。
表示直線的方式有好多種,ax+by+c=0隻是其中之一。因為已經知道兩點的坐標,我們採用兩點式來表示直線。
令:(x0,y0)=(0, 0), (x1,y1)=(1,2)
則直線方程為:(y-y0)/(y0-y1)=(x-x0)/(x0-x1)
代入(y-0)/(0-1) = (x-0)/(0-2)
整理之後,得到直線方程:x - 2y = 0;
所以a=1, b=-2, c=0;方程直線為x - 2y.
❹ C語言編程,直線方程y=kx+3,要求輸入y坐標以及k,求x坐標。
main()
{
基本語言我忘記了,用中文描述好了
定義Y,K,x的值為float;
scanf函數給Y,K變數復制;
X=(Y-3)/K;
printf函數輸出X變數;
}
❺ c語言求直線方程
應該是
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
double 類型對應的輸出格式為%lf,格式不匹配可能會出錯。
不是"/"的問題,因為y2-y1和x2-x1均為double類型,因此這里不是整除。
❻ 用C語言編寫 在平面上,穿過兩個點(x1,y1)和(x2,y2)的直線是由下面的方程定義的:
p1和p2的坐標代入直線方程中,得到:
c1=a*x1+b*y1;
c2=a*xx2+by2;
如果c1和c2都小於c 或者c1和c2都大於c說明兩個點位於直線的同一側。
主要是數學問題,高中數學。
❼ 用c語言程序設計,求代碼
提供兩種思路,這里只給思路不給代碼,因為網路知道現在似乎貼代碼格式會亂,而且自己寫代碼更容易進步。
第一種暴力的方法:遍歷所有格點,用勾股定理算出三條邊長度,用海倫公式算出面積。
勾股定理這個大家都會。海倫公式可以通過三邊長度算出三角形面積。
海倫公式大致內容:令 p = ( a + b + c ) / 2 ,則 S = sqrt [ p ( p - a ) ( p -b ) ( p - c ) ] 。
(之前題目看錯了。。重新寫一遍這個方法
暴力的方法在 9×9 的范圍內當然跑得快,但是如果題目加強,讓你在 10^7×10^7 的方格內找好點,你怎麼找?
第二種方法:根據面積相等和底邊長度關系,可以求出高的比值,然後設出其中一條高的長度,就能得到另一條高的長度。然後寫出兩個直線方程並聯立,可以得到一個新的方程。這個方程的圖象上的整點就是好點。
聽起來有點繞,拿這道題做例子就好理解了。
設 △PAB 的高為 a (為了方便記作條件①),則 △PAC 的高為 2a (條件②)。
以方格左下角為原點建系,可以寫出滿足條件①的直線解析式 y = x + √2 a 。
同理滿足條件②的直線解析式為 y = 12 - x - 2√2 a 。(這里 a 的系數可正可負,篇幅原因只算一種,另一種後面代入一遍就好了)
聯立可得 P 坐標為 ( 6 - 3√2/2 a, 6 - √2/2 a )。
根據坐標式子和題目性質可得 P 圖象必定過 A( 6, 6 ),並且圖象是一條直線。
設 P : y = k ( x - 6 ) + 6 ,代入坐標解得 k = 1/3 。
所以 P 在直線 y = 1/3 x + 4 上。
同理,P 也在直線 y = 3 x - 12 上。
然後把所有橫坐標代入就好啦,復雜度直接少了一階。(事實上還可以繼續優化,不過這樣已經很優了)
❽ 雅克比迭代法求解線性方程組的C語言程序
void Solve ( double dCoef [] , double dY [] , unsigned int iOrder , double dErr)
{//用Jacobi迭代法解方程組, dCoef[]系數陣, Y[]向量, iOrder給出方程階數, dErr給出精度
double res [Max]; //方程解
double res2[Max]; //保存上一階方程解
if ( Max < iOrder )
{
printf ("最多支持%d階方程組.", Max);
return;
}
for ( unsigned int i = 0 ; i < iOrder ; res2 [i++] = 0.0 ); //初始解向量 (0,0...)
while ( true )
{
bool bStopIterative = true;
for (unsigned int i = 0 ; i < iOrder ; ++i)
{
double dSum2 = 0;
for (unsigned int j = 0 ; j < iOrder ; j++)
{//求第二項
if ( j == i ) continue;
dSum2 += dCoef [i * iOrder + j] * res2 [j];
}
res[i] = 1/dCoef[i * iOrder + i] * ( dY[i] - dSum2 );
if ( abs ( res2[i] - res [i] ) > dErr )
bStopIterative = false;
}
if ( bStopIterative )
break;
for (unsigned int i = 0 ; i < iOrder ; i++ )
res2[ i ] = res[ i ];
}
//輸出結果
for (unsigned int i = 0 ; i < iOrder ; i++)
printf ("x%d = %lf\n", i+1 , res[i]);
}
int main(int argc, char* argv[])
{
double a[] =
{
8,-3,2,
4,11,-1,
2,1,4
};
double b[3] =
{
20,33,12
};
Solve ( a , b , 15 , 1e-10);
getchar();
return 0;
}
❾ c語言解線性方程組的編程題 【做的好會多給分】
以下演算法的適用條件:A的各階主子式不為零
另外還可以採用
直接法:
消元法:Gauss-Jordan消元法,
分解法:Dolittle分解 (我用的是Courant分解法),追趕法,對稱正定矩陣的LDL『分解
----------
迭代法:
Jacobi迭代
Gauss-Seidel迭代
鬆弛迭代
-----------------
你上網可以搜索一下,或者看看數值計算方面的書
OK, 你看看這個, 另外還加了注釋 :
Courant分解演算法:
aX = b, 作 A=LU, L是下三角矩陣, U是上三角矩陣
即L =
| L11
| L21 L22
| L31 L32 L33
| ..............
| Ln1 Ln2 ........Lnn
U =
| 1 U12 ..... U1n
| 空格 1 ..... U2n
| 空格 空格 ........
| 空格 空格 空格 空格 空格1
---------------------------------------------------
aX = b -----> LUX = b
記 UX = y,
由Ly = b得到
因為無法輸出數學符號,以下採用[i, j]Ai 表示對Ai從i到j求和
yi = (bi - [j=1, i-1]Lij yj) / Lii i = 1, 2, ..., n
由UX = y得到
xi = yi - [j=i+1, n]uij xj j = n, n-1, ..., 2, 1
你在紙上驗證一下就明白了
--------------------------------------------------------------
以下採用Courant分解 解 aX = b, 經檢查,程序運行正確
這是運行結果:
--------------------------------------------------------------
Input n value(dim of Ax=b): 3
Now input the matrix a(i, j), i, j = 0, ..., 2:
1 2 1 -2 -1 -5 0 -1 6
Now input the matrix b(i), i = 0, ..., 2:
24 -63 50
Solve...x_i =
7.000000
4.000000
9.000000
--------------------------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#define MAX_N 20
int main(int argc, char* argv[])
{
int n; // 未知數個數
int i, j, k;
static double a[MAX_N][MAX_N], b[MAX_N], x[MAX_N], y[MAX_N];
static double l[MAX_N][MAX_N], u[MAX_N][MAX_N];
printf("\nInput n value(dim of Ax=b): ");
scanf("%d", &n);
if(n >MAX_N)
{
printf("The input n is larger than MAX_N, please redefine the MAX_N.\n");
return 1;
}
if(n <= 0)
{
printf("Please input a number between 1 and %d.\n", MAX_N);
return 1;
}
// {{ 程序輸入
printf("Now input the matrix a(i, j), i, j = 0, ..., %d:\n", n-1);
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%lf", &a[i][j]);
printf("Now input the matrix b(i), i = 0, ..., %d:\n", n-1);
for(i=0; i<n; i++)
scanf("%lf", &b[i]);
// }} 程序輸入
for(i=0; i<n; i++)
u[i][i] = 1; //
for(k=0; k<n; k++)
{
for(i=k; i<n; i++) // 計算L的第k列元素
{
l[i][k] = a[i][k];
for(j=0; j<=k-1; j++)
l[i][k] -= (l[i][j]*u[j][k]);
}
for(j=k+1; j<n; j++) //計算U的第k行元素
{
u[k][j] = a[k][j];
for(i=0; i<=k-1; i++)
u[k][j] -= (l[k][i]*u[i][j]);
u[k][j] /= l[k][k];
}
}
for(i=0; i<n; i++) // 解Ly = b
{
y[i] = b[i];
for(j=0; j<=i-1; j++)
y[i] -= (l[i][j]*y[j]);
y[i] /= l[i][i];
}
for(i=n-1; i>=0; i--) // 解UX = Y
{
x[i]=y[i];
for(j=i+1; j<n; j++)
x[i] -= (u[i][j]*x[j]);
}
printf("Solve...x_i = \n"); // 輸出結果
for(i=0; i<n; i++)
printf("%f\n", x[i]);
return 0;
}
❿ c語言解y=a/x+b
用x'代替x,就轉化為直線方程了,最小二乘法有公式,自己求偏導推一下也很方便,10組數據量很小,直接計算就OK了。。