紫墨 发表于 2017-5-24 15:41:13

新手求助 解四元一次方程组的程序

各位大神帮忙看看,arduino解方程组的结果,和我用C语言消元法的结果不一样,是指针的问题吗

#include "Wire.h"
#include "I2Cdev.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void *solve(double *c,int n);
typedef struct
{
double x[];
}struc;
LiquidCrystal lcd(9,8,5,6,3,2);
#define   N20
bool blinkState = false;
void *solve(double *c,int n)
{   
int i,j,t,k;   
double *x,p;   
x=(double *)malloc(n*sizeof(double));   
for(i=0;i<=n-2;i++)   
{   
k=i;   
for(j=i+1;j<=n-1;j++)   
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))   
k=j;   
if(k!=i)   
for(j=i;j<=n;j++)   
{   
   p=*(c+i*(n+1)+j);   
   *(c+i*(n+1)+j)=*(c+k*(n+1)+j);   
   *(c+k*(n+1)+j)=p;   
}   
for(j=i+1;j<=n-1;j++)   
{   
   p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));   
   for(t=i;t<=n;t++)   
   *(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));   
}   
}   
for(i=n-1;i>=0;i--)   
{   
for(j=n-1;j>=i+1;j--)   
(*(c+i*(n+1)+n))-=x*(*(c+i*(n+1)+j));   
x=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));   
}   
return x;
}
void setup()
{
struc s;
Wire.begin();
// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(9600);
double u10r,u10i,u20r,u20i,an10,an20,u10,u20;
double a11,a21,a12,a22,r11,r21,r12,r22,a11r,a11i,a12r,a12i,a21r,a21i,a22r,a22i,f1r,f1i,f3r,f3i;
double f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20;
int i;
double f;
double a={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
double *x;
int n=4;
f=56.78;f=236.24;f=43.38;f=100.11;f=55.31;
f=241.37;f=5;f=0.4;f=45.38;f=103.76;
f=2;f=0.4;f=56.63;f=242.97;f=2;f=0.4;
f=45.89;f=103.82;f=5;f=0.4;
f1=f;f2=f*PI/180;f3=f;f4=f*PI/180;f5=f;f6=f*PI/180;f7=f;f8=f;f9=f;f10=f*PI/180;f11=f;
f12=f;f13=f;f14=f*PI/180;f15=f;f16=f;f17=f;f18=f*PI/180;f19=f;f20=f;
a11=(sqrt((f5*cos(f6)-f1*cos(f2))*(f5*cos(f6)-f1*cos(f2))+(f5*sin(f6)-f1*sin(f2))*(f5*sin(f6)-f1*sin(f2))))/(f7*f8);
r11=atan((f5*sin(f6)-f1*sin(f2)))/(f5*cos(f6)-f1*cos(f2));
if (f5*cos(f6)-f1*cos(f2)<0)
{
   r11=r11+PI;
}
a12=(sqrt((f9*cos(f10)-f1*cos(f2))*(f9*cos(f10)-f1*cos(f2))+(f9*sin(f10)-f1*sin(f2))*(f9*sin(f10)-f1*sin(f2))))/(f11*f12);
r12=atan((f9*sin(f10)-f1*sin(f2)))/(f9*cos(f10)-f1*cos(f2));
if (f9*cos(f10)-f1*cos(f2)<0)
{
   r12=r12+PI;
}
a21=(sqrt((f13*cos(f14)-f3*cos(f4))*(f13*cos(f14)-f3*cos(f4))+(f13*sin(f14)-f3*sin(f4))*(f13*sin(f14)-f3*sin(f4))))/(f15*f16);
r21=atan((f13*sin(f14)-f3*sin(f4)))/(f13*cos(f14)-f3*cos(f4));
if (f13*cos(f14)-f3*cos(f4)<0)
{
   r21=r21+PI;
}
a22=(sqrt((f17*cos(f18)-f3*cos(f4))*(f17*cos(f18)-f3*cos(f4))+(f17*sin(f18)-f3*sin(f4))*(f17*sin(f18)-f3*sin(f4))))/(f19*f20);
r22=atan((f17*sin(f18)-f3*sin(f4)))/(f17*cos(f18)-f3*cos(f4));
if (f17*cos(f18)-f3*cos(f4)<0)
{
   r22=r22+PI;
}
a11r=a11*cos(r11);
a11i=a11*sin(r11);
a12r=a12*cos(r12);
a12i=a12*sin(r12);
a21r=a21*cos(r21);
a21i=a21*sin(r21);
a22r=a22*cos(r22);
a22i=a22*sin(r22);
f1r=f1*cos(f2);
f1i=f1*sin(f2);
f3r=f3*cos(f4);
f3i=f3*sin(f4);
a=a11r;a=-a11i;a=a12r;a=-a12i;a=f1r;
a=a11i;a=a11r;a=a12i;a=a12r;a=f1i;
a=a21r;a=-a21i;a=a22r;a=-a22i;a=f3r;
a=a21i;a=a21r;a=a22i;a=a22r;a=f3i;
x=solve(a,n);   
u10r=x;
u10i=x;
u20r=x;
u20i=x;
loop();
return 0;
}
void loop()   /*输出结果*/
{   

double u10r,u10i,u20r,u20i,an10,an20,u10,u20;
u10=sqrt(u10r*u10r+u10i*u10i);
an10=atan(u10i/u10r)*180/PI;
if (u10r<0)
{
   an10=an10+180;
}
u20=sqrt(u20r*u20r+u20i*u20i);
an20=atan(u20i/u20r)*180/PI;
if (u20r<0)
{
   an20=an20+180;
}
   Serial.print(u10r);
   Serial.print("\t");
   Serial.print("\n");
   Serial.print(u10i);
   Serial.print("\t");
   Serial.print("\n");
Serial.print(u20);
   Serial.print("\t");
   Serial.print("\n");
   Serial.print(an20);
   Serial.print("\t");
   Serial.print("\n");
}
页: [1]
查看完整版本: 新手求助 解四元一次方程组的程序