极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11981|回复: 0

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

[复制链接]
发表于 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   N  20
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[j]*(*(c+i*(n+1)+j));   
  x[i]=*(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[N];  
  double a[4][5]={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[0]=56.78;f[1]=236.24;f[2]=43.38;f[3]=100.11;f[4]=55.31;
  f[5]=241.37;f[6]=5;f[7]=0.4;f[8]=45.38;f[9]=103.76;
  f[10]=2;f[11]=0.4;f[12]=56.63;f[13]=242.97;f[14]=2;f[15]=0.4;
  f[16]=45.89;f[17]=103.82;f[18]=5;f[19]=0.4;
  f1=f[0];f2=f[1]*PI/180;f3=f[2];f4=f[3]*PI/180;f5=f[4];f6=f[5]*PI/180;f7=f[6];f8=f[7];f9=f[8];f10=f[9]*PI/180;f11=f[10];
  f12=f[11];f13=f[12];f14=f[13]*PI/180;f15=f[14];f16=f[15];f17=f[16];f18=f[17]*PI/180;f19=f[18];f20=f[19];
  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[0][0]=a11r;a[0][1]=-a11i;a[0][2]=a12r;a[0][3]=-a12i;a[0][4]=f1r;
  a[1][0]=a11i;a[1][1]=a11r;a[1][2]=a12i;a[1][3]=a12r;a[1][4]=f1i;
  a[2][0]=a21r;a[2][1]=-a21i;a[2][2]=a22r;a[2][3]=-a22i;a[2][4]=f3r;
  a[3][0]=a21i;a[3][1]=a21r;a[3][2]=a22i;a[3][3]=a22r;a[3][4]=f3i;
  x=solve(a[0],n);   
  u10r=x[0];
  u10i=x[1];
  u20r=x[2];
  u20i=x[3];
  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");
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 10:38 , Processed in 0.036922 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表